网络上有很多文章,有关StackExchange的答案,建议使用类似这样的代码行(甚至更长的超时时间),以避免在长时间运行的过程中MySQL超时错误(例如但不限于“ MySQL服务器已消失”)。 “):

ini_set('mysql.connect_timeout', 300);
ini_set('default_socket_timeout', 300);


但是,我无法很好地解释它们是如何解决问题的。在许多情况下,它们似乎是没有明确基础的货物崇拜编程。我很好奇这些设置对MySQL连接生命周期的精确程度:官方文档不清楚它们何时适用和评估。

据我所知,mysql.connect_timeout仅与MySQL的原始连接有关。因此,此设置似乎与最初建立成功的连接之后的连接失败问题无关。设置default_socket_timeout可能与以后的连接问题更相关,但尚不清楚到底是什么触发了超时。它也仅在连接时才有意义,还是整个套接字寿命都超时?是什么触发超时?流量不足?缺乏特定类型的流量?

准确了解它们与MySQL连接的交互方式非常重要,这样才能合理地推断出错误行为。

最佳答案

在长时间运行的进程中,这两种设置都与“ mysql走开”无关。从历史上看,MySQL没有办法限制查询的最大运行时间,因此它们可以永远运行,并且由于在I / O事件期间不检查phps的最大执行时间,因此也无法停止查询。

要限制SQL查询的运行时间,可以在5.7中使用新的MySQL功能:

SELECT /*+ MAX_EXECUTION_TIME(1000) */ status, count(*) FROM articles GROUP BY status ORDER BY status;
SET SESSION MAX_EXECUTION_TIME=2000;
SET GLOBAL MAX_EXECUTION_TIME=2000;


我在这里写了一篇有关此内容的博客文章,内容如下:

https://tideways.com/profiler/blog/use-timeouts-to-prevent-long-running-select-queries-from-taking-down-your-mysql

但是要修复MySQL已经不复存在,您需要在长时间运行的脚本中指出一个地方,即您一段时间没有执行任何操作并添加“ ping”。

try {
    $pdo->query("SELECT 1");
} catch (PDOException $e) {
    if (stripos($pdo->getMessage(), "mysql gone away")) {
        // reconnect
    }
}


这样,只要mysql消失,您就可以重新连接。

关于php - default_socket_timeout和mysql.connect_timeout之间的确切关系?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52008064/

10-11 22:04
查看更多