php - MySQL 中的 "many successive interrupted connection requests"是什么?

标签 php mysql

我经常遇到以下错误:

PHP fatal error :消息为“SQLSTATE[HY000] [1129] 主机“我的服务器”因许多连接错误而被阻止的未捕获异常“PDOException”;使用“mysqladmin flush-hosts”解锁

使用常规(如 crontab)mysqladmin flush-hosts 命令或增加 max_connect_errors 系统变量很容易解决问题,如写的 here .

但是!什么是“许多连续中断的连接请求”,为什么会这样?

我宁愿在上游阻止问题,也不愿纠正阻塞。

MySQL 版本:5.5.12。我正在使用 Zend Framework 1.11.10 和 Doctrine 2.1.6。

我的 PHP 代码中没有 mysql_close() 和 mysqli_close()。

max_connect_errors 具有默认值 10,我还不想增加它,我想了解为什么会出现错误。我使用一个 cron,每 5 分钟执行一次 mysqladmin flush-hosts 命令。

最佳答案

此响应是作为安全措施设计的,是达到 mysql 的 ma​​x_connection_errors 值的结果。 Here's a link Oracle 提供了其中大部分可能的原因和解决方案的详细信息。

最终这意味着有太多连续的连接失败,以至于 MySql 停止响应连接尝试。

I use a cron, every 5 minutes which does a mysqladmin flush-hosts command.

由于您很快就达到了这个限制,所以只有几个可能的罪魁祸首:

  1. 服务器未正确配置为使用 PDO。
  2. 运行代码包括非常频繁地创建新连接。
    • 导致快速达到 ma​​x_connections 值,导致所有后续连接尝试失败...从而快速达到 ma​​x_connection_errors 限制。
  3. 代码陷入无限循环或级联故障。
    • 明显的可能性,但必须提及。
    • (即:pageA调用pageB和pageC,pageC调用PageA)
  4. PDO 运行良好,但有些脚本需要很长时间才能运行,或者永远不会结束。
    • 最简单的方法是调低 ma​​x_execution_time

很可能无论如何,这都很难追踪。

  1. 记录每个 mysql 连接尝试的堆栈跟踪,以找出导致此问题的代码。
  2. 检查 mysql.err 日志文件

虽然 PDO 不需要显式关闭 mysql 连接,但对于这种情况,有一些做法可以防止此类 ServerAdmin 搜索。

  • 始终明确关闭 mysql 连接。
    • 构建一个 simple Class处理所有连接。打开,返回数组,关闭。
    • 唯一需要保持连接打开的时间是游标。
  • 始终在一个文件中定义连接参数,并且只在一个文件中包含所有需要的地方。
  • 永远不要增加ma​​x_execution_time,除非您知道您需要它并且您知道服务器可以处理它。 如果您需要它,只为需要它的脚本显式增加该值。 php.net/manual/en/function.set-time-limit.php
    • 如果您增加 ma​​x_execution_time,请增加 ma​​x_connections

dev.mysql.com/doc/refman/5.0/en/cursors.html

关于php - MySQL 中的 "many successive interrupted connection requests"是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11791128/

相关文章:

MySQL,返回最近 X 小时内的所有测量值和结果

mysql - 哪个数据库表更好?

php - 在 PHP 中 |= 是什么意思,即管道等于(不是感叹号)

php - 未列出的保留字?

javascript - json 编码新日期 javascript

java - 为 secure spring petclinic 的每个用户单独的 mysql 登录

sql - 更改没有主键的表中的每条记录?

PHP 嵌套each/while

PHP页面不显示

php - 修改php oop mysql查询