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停止响应连接尝试.
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运行正常,但有些脚本需要很长时间才能运行,或者永远不会结束.
无论如何,这很可能难以追查.
>记录每个MysqL连接尝试的堆栈跟踪,以查找导致此问题的代码.
>检查MysqL.err日志文件
虽然PDO不需要显式关闭MysqL连接,但对于这种情况,有一些实践可以阻止这样的ServerAdmin搜索.
>构建一个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