网上有很多文章和stackexchange上的答案,它们建议使用这样的行(甚至更长的超时),以避免在长时间运行的进程中出现mysql超时错误(例如但不限于“mysql server已经消失”):
ini_set('mysql.connect_timeout', 300);
ini_set('default_socket_timeout', 300);
然而,我找不到一个很好的解释,究竟这些解决问题。在许多情况下,它们似乎是没有明确基础的货物崇拜节目。我很好奇这些设置对mysql连接生命周期的影响到底有多大:官方文档对它们的应用和测量时间含糊不清。
据我所知 mysql.connect_timeout
只与mysql的原始连接有关。因此,此设置似乎与最初成功建立连接后的连接失败问题无关。设置 default_socket_timeout
可能与以后的连接问题更相关,但不清楚究竟什么会触发超时。它是否也仅在连接时相关,还是整个套接字生存期的超时?什么触发了超时?交通不畅?缺少特定类型的流量?
准确地理解它们是如何与mysql连接交互的对于能够合理地解释错误行为非常重要。
1条答案
按热度按时间dw1jzc5e1#
这两种设置都与在长时间运行的进程中获取“mysql已经消失”无关。mysql以前没有办法限制查询的最大运行时间,因为它们可以永远运行,而且在i/o事件期间不会检查phps max execution time,所以它不会停止这一点。
要限制sql查询运行时,您可以在5.7中使用新的mysql功能:
我在这里写了一篇关于这个的博客文章,详细内容如下:
https://tideways.com/profiler/blog/use-timeouts-to-prevent-long-running-select-queries-from-taking-down-your-mysql
但要修复mysql已经消失,您需要在长时间运行的脚本中添加一个点,您知道它有一段时间没有做任何事情,并添加一个“ping”。
这样你就可以在mysql离开时重新连接。