MySQL有一项强制执行最大连接数的功能max_user_connections。
从PHP(和other languages)连接时,如果超过该数字,我的理解是您的连接将失败并显示一条错误,指出您已超过最大连接数。正确的吗?
我的偏好是将连接调用等待(达到某个超时限制)以使连接可用。但是,我无法通过阅读MySQL文档和搜索网络来确定一种方法。
我担心的是,如果我们的网络应用程序流量大,导致大量并发MySQL连接尝试,我们的一些用户脚本将以错误结束。当然,我们可以修改调用代码以尝试重新连接一定次数,但如果我们可以修改连接尝试本身来处理这个问题,那么它会更加清晰,而不是必须包装每个" connect& #34;呼叫循环。另外,循环不会产生真正的FIFO队列,因为每个单独的调用线程将等待一小段时间并再次尝试,并且它是否获得连接将取决于在该特定时刻连接是否可用。然后它会再次等待,当它正在等待时,连接可能会打开并且另一个线程会进一步回到线路中#34;可能会抓住它。
因此,当使用任何PHP API连接到MySQL时,是否有办法在&#34中尝试连接;等待连接可用"时尚?
答案 0 :(得分:2)
MySQL没有任何功能可以执行您所描述的内容。也就是说,当你点击max_connections
时,MySQL没有连接的FIFO(队列)。如果所有连接无法立即连接,则会出错。
MySQL内置的最接近的相关内容是配置变量back_log
,它仅配置未完成连接数的限制。也就是说,主MySQL线程需要花费很少的时间来检查传入的连接,并且它们在侦听队列中堆叠,这在套接字甚至完成之前以及MySQL确定我们是否已超过{{ 1}}线程。实际上,即使服务器当前远远低于max_connections
线程,您也可以在侦听队列中获得一堆未完成的连接。
http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_back_log
另一种选择是将HA-Proxy添加到混合中,因为HA-Proxy 提供了队列功能。这是一个博客,可以解释更多:http://flavio.tordini.org/a-more-stable-mysql-with-haproxy
坦率地说,大多数网站只增加max_connections
,直到它可以处理您的典型流量峰值,并从那里尝试优化数据库活动,因此连接时间很短,因此您具有良好的吞吐量。它还有助于编写应用程序以尽可能晚地连接,并在完成所有查询后尽快断开连接。
如果您的流量超过max_connections
的非典型峰值,那么您的应用程序将收到错误消息,指出该情况。您应该编写应用程序代码以优雅地处理此类错误。也就是说,尽可能好地显示消息,例如"我们很抱歉,我们的负载太大,无法处理您的请求,请稍后再回过头来看。"这至少比突然的白色屏幕,或堆栈痕迹等更好。
答案 1 :(得分:-2)
尝试在页脚的所有php页面中添加以下php代码:
mysql_close();
通常,您的错误消息是没有关闭的mysql连接,并保持服务器端的连接。 但是,这只是我很久以前的愚蠢编码错误。 如果关闭mysql连接也无法修复你的问题。 我认为您需要登录到服务器以更改php.ini的某些设置以增加连接用户值。 我希望我的回答可以帮助您解决问题。