php – MySQL中“许多连续中断的连接请求”是什么?

我经常有以下错误:

PHP致命错误:带有消息’SQLSTATE [HY000]的未捕获异常’PDOException'[1129]由于许多连接错误,主机’MY SERVER’被阻止;使用’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的max_connection_errors值的结果. Here’s a link Oracle提供了大部分可能原因和解决方案的详细信息.

最终,这意味着有很多连续的连接失败,MySql停止响应连接尝试.

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

当你如此迅速地达到这个限制时,只有少数可能的罪魁祸首:

>服务器未正确配置为使用PDO.
>运行代码包括非常频繁地创建新连接.

>导致快速达到max_connections值,导致所有后续连接尝试失败…从而快速达到max_connection_errors限制.

>代码遇到无限循环或级联失败.

>明显的可能性,但必须提到.
>(即:pageA调用pageB和pageC,pageC调用PageA)

> PDO运行正常,但有些脚本需要很长时间才能运行,或者永远不会结束.

>最简单的方法是关闭max_execution_time.

无论如何,这很可能难以追查.

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

虽然PDO不需要显式关闭mysql连接,但对于这种情况,有一些实践可以阻止这样的ServerAdmin搜索.

>始终显式关闭mysql连接.

>构建一个simple Class来处理所有连接.打开,返回数组,关闭.
>唯一需要保持连接打开的时间是游标.

>始终在一个且仅在一个所需位置包含的文件中定义连接参数.
>永远不要增加max_execution_time,除非您知道需要它,并且您知道服务器可以处理它.如果需要,只显示需要它的脚本的值. php.net/manual/en/function.set-time-limit.php

>如果增加max_execution_time,请增加max_connections.

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

相关文章
相关标签/搜索