PHP到MySQL的连接:等待连接可用,而不是抛出";超过了max_user_connections';错误


PHP to MySQL connection: wait until a connection is available, instead of throwing "max_user_connections exceeded" error?

MySQL有一个强制执行最大连接数max_user_connections的功能。

当从PHP(和其他语言)连接时,如果您超过了这个数字,我的理解是,您的连接将失败,并出现一个错误,说明您已经超过了最大连接数。对的

我的偏好是让连接呼叫等待(直到某个超时限制),以便连接可用。然而,我还无法通过阅读MySQL文档和搜索网络来确定实现这一点的方法。

我担心的是,如果我们的web应用程序流量过大,导致大量并发MySQL连接尝试,我们的一些用户脚本将以错误告终。当然,我们可以修改调用代码,尝试重新连接一定次数,但如果我们可以修改连接尝试本身来处理这一问题,而不必将每个"连接"调用都封装在一个循环中,则会更干净。此外,循环不会导致真正的FIFO队列,因为每个单独的调用线程都会等待一小段时间并重试,而它是否获得连接将取决于在特定时刻是否有连接可用。然后它会再次等待,在等待的过程中,一个连接可能会打开,另一个"更靠后的线程"可能会抓住它

那么,当使用任何一个PHP API连接MySQL时,是否有一种方法可以尝试以"等待连接可用"的方式进行连接?

MySQL没有任何功能可以实现您所描述的功能。也就是说,当您点击max_connections时,MySQL没有连接的FIFO(队列)。如果无法立即连接,则所有连接都会出现错误。

MySQL中最相关的是配置变量back_log,它只配置未完成连接数的限制。也就是说,MySQL主线程需要少量时间来检查传入连接,这些连接会堆积在侦听队列中,这是在套接字完成之前,也是在MySQL确定我们是否有超过max_connections的线程之前。事实上,即使服务器当前远低于max_connections线程,您也可以在侦听队列中获得一堆未完成的连接。

http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_back_log

另一个选项是将HA代理添加到混合中,因为HA代理确实具有队列功能。下面有一个博客对此进行了详细解释:http://flavio.tordini.org/a-more-stable-mysql-with-haproxy

坦率地说,大多数站点只是增加max_connections,直到它能够处理典型的流量峰值,然后尝试优化数据库活动,因此连接持续时间短,因此您有很好的吞吐量。这也有助于对应用程序进行编码,使其尽可能晚地连接,并在完成所有查询后尽快断开连接。

如果您的流量出现非典型峰值,超过max_connections,那么您的应用程序将收到一个指示该峰值的错误。你应该对你的应用程序进行编码,以优雅地处理此类错误。也就是说,尽可能漂亮地显示一条消息,比如"很抱歉,我们的负载太大,目前无法处理您的请求,请稍后再试。"这至少比突然出现的白色屏幕或堆栈跟踪之类的要好。

尝试在页脚的所有php页面中添加以下php代码:

  mysql_close();

通常,您的错误消息是没有关闭的mysql连接,并保持服务器端的连接。然而,这只是我很久以前愚蠢的编码错误。如果关闭mysql连接也无法解决您的问题。我认为您需要登录到服务器来更改php.ini的一些设置,以增加连接用户值。我希望我的回答能帮助你们解决问题。

相关文章: