StackExchange上有许多文章和答案建议使用这样的行(甚至更长的超时),以避免在长时间运行过程中出现MySQL超时错误(例如,但不限于,"MySQL服务器已消失“):
ini_set('mysql.connect_timeout', 300);
ini_set('default_socket_timeout', 300);然而,我找不到一个很好的解释来解释这些是如何解决问题的。在许多情况下,它们似乎是没有明确基础的货物狂热编程。我很好奇这些设置如何精确地影响MySQL连接生命周期:官方文档对它们的应用和测量都是含糊其辞的。
据我所知,mysql.connect_timeout只与MySQL的原始连接有关。因此,在最初成功建立连接后,此设置似乎与连接失败问题无关。设置default_socket_timeout可能与以后的连接问题更相关,但不清楚到底是什么触发了超时。它是否也只与连接相关,或者是整个套接字生命周期的超时?是什么触发了超时?交通不畅?缺少特定类型的流量?
准确地了解它们如何与MySQL连接交互对于能够合理地推断错误行为是很重要的。
发布于 2018-08-25 02:57:02
这两个设置都与在长时间运行的进程中获得"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;我在这里写了一篇关于这方面的博客文章,详细介绍了:
但是要修复MySQL的消失,你需要在你的长时间运行的脚本中找到一个点,在你知道它有一段时间没有做一些事情的地方,并添加一个"ping“。
try {
$pdo->query("SELECT 1");
} catch (PDOException $e) {
if (stripos($pdo->getMessage(), "mysql gone away")) {
// reconnect
}
}这样,无论何时mysql离开,您都可以重新连接。
https://stackoverflow.com/questions/52008064
复制相似问题