Php MySQL(i)“;“连接太多”;怎么办?
我正在编写一个hugh MySQLi/PHP应用程序,我的数据库遇到了问题,在运行了几个小时之后,似乎有太多的连接(250个)打开了 我在网络中使用了一个非常快速的外部数据库服务器。我每秒要问1000个问题,服务器似乎没有什么印象(负载接近0) 在我的应用程序中,MySQLi链接被数据库类的析构函数关闭(这似乎工作正常) 我使用的是预先准备好的语句,还有两个守护进程运行着无限while循环和其中的一些查询(循环被Php MySQL(i)“;“连接太多”;怎么办?,php,mysql,mysqli,Php,Mysql,Mysqli,我正在编写一个hugh MySQLi/PHP应用程序,我的数据库遇到了问题,在运行了几个小时之后,似乎有太多的连接(250个)打开了 我在网络中使用了一个非常快速的外部数据库服务器。我每秒要问1000个问题,服务器似乎没有什么印象(负载接近0) 在我的应用程序中,MySQLi链接被数据库类的析构函数关闭(这似乎工作正常) 我使用的是预先准备好的语句,还有两个守护进程运行着无限while循环和其中的一些查询(循环被usleep()延迟以防止过度使用,我必须注意,mysqli\u connect()
usleep()
延迟以防止过度使用,我必须注意,mysqli\u connect()
仅在启动守护进程时才被调用)
但是我似乎从来没有用stmt->close()
关闭我准备好的语句。在数据库中的查询统计下,我可以看到stmt->close()
问题的数量等于stmt->execute()
的数量。那么,这可能是问题所在吗?例如,我何时必须关闭stmt?我不知道从哪里找到解决这个问题的办法
软件版本
CentOS 6.5下的PHP 5.5和MySQL 5.6,这里有一些东西可以尝试: 第一:在无限循环守护进程中:在睡眠前关闭连接,在醒来时再次打开连接。不要试图长时间保持数据库连接打开。客户机-服务器连接中有各种各样的超时逻辑,当您不希望它激活时,它可能会激活,从而导致无法预知的故障。打开连接,使用它们,然后关闭它们,可以避免这种情况 第二:尝试使用所谓的持久连接。在
mysqli
中,您可以将p:
预先添加到主机名以执行此操作。请阅读以下内容:
第三:在使用完准备好的语句后,最好明确地关闭它们,如果重复使用,最好在两次使用之间重置它们。mysqli dtor应该自动执行此操作,但这仍然是一种良好的实践
第四:您可能希望配置Apache或ngnix服务器软件以生成更少的实例和线程。这些实例和/或线程是可串行恢复的资源,Linux的TCP堆栈在为它们排队连接请求方面做得很好。这将减少MySQL需要处理的连接数
第五:是否需要更改MySQL的配置以允许超过250个连接?如果您要将web流量负载平衡到许多web服务器,您可能需要这样做
恭喜你获得了大量的流量!现在来点真正的乐趣。bwahahaha.我对PHP PDO没有太多的经验,但这可能是一个有用的开始:什么平台?什么web服务器软件?什么版本的php?@oliakaoil我不使用PDO,我使用php MySQLi。但我会阅读你的建议。问题是使用usleep的脚本执行多长时间。如果他们运行30分钟,而你在一段时间内给他们打了太多电话,他们可以使用很多连接。另一个问题是你网站上的流量是多少,以及“太多连接”是否以某种方式连接到用户操作(许多用户访问你的网站)或通过你所谓的deamons。我认为问题在于你的守护进程-你启动它们,可能永远不会完成之前启动的守护进程,因此在一段时间后,你会达到最大连接limit@OllieJonesCentOS 6.5下的PHP5.5和MySQL 5.6我在一个长轮询ajax调用中发现了错误。这个调用发生在我后端的每个页面视图中,并且没有结束时间,除非有数据要返回:-)所以通过遍历我的后端,它生成了很多无休止的进程(我很愚蠢,我知道lol)。我有很多代码根据你的答案重写。例如:我的守护进程每30秒重新连接一次,这样它们就不会再长时间保持连接打开,我现在正在使用
stmt->close()
和stmt->reset()
。这个问题现在似乎已经解决了。谢谢你的帮助!这种事情(细节不同,一般原则相同)发生在每个扩展的web应用程序中。一点也不愚蠢。这在学校里很难教。