gpt4 book ai didi

php - default_socket_timeout 和 mysql.connect_timeout 之间的确切关系?

转载 作者:行者123 更新时间:2023-11-29 10:05:27 24 4
gpt4 key购买 nike

网络上有很多文章和 StackExchange 上的答案都建议使用类似这样的行(甚至更长的超时)来避免长时间运行的进程中 MySQL 超时的错误(例如但不限于“MySQL 服务器已经消失了”):

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

但是,我找不到这些解决问题的具体解释。在许多情况下,它们似乎是没有明确基础的 cargo 崇拜编程。我很好奇这些设置对 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com