- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
网络上有很多文章和 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;
我在这里写了一篇关于此内容的博客文章,其中包含详细信息:
但是要修复 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/
网络上有很多文章和 StackExchange 上的答案都建议使用类似这样的行(甚至更长的超时)来避免长时间运行的进程中 MySQL 超时的错误(例如但不限于“MySQL 服务器已经消失了”): in
在我的 php 脚本中,我恢复了 db2 数据库备份。他们越来越大。所以现在我在执行脚本后 +-30 分钟后收到 500 服务器错误。 (mod_fastcgi.c.3352) 中有这一行未收到响应,
我是一名优秀的程序员,十分优秀!