Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL(i)“;“连接太多”;怎么办?_Php_Mysql_Mysqli - Fatal编程技术网

Php MySQL(i)“;“连接太多”;怎么办?

Php MySQL(i)“;“连接太多”;怎么办?,php,mysql,mysqli,Php,Mysql,Mysqli,我正在编写一个hugh MySQLi/PHP应用程序,我的数据库遇到了问题,在运行了几个小时之后,似乎有太多的连接(250个)打开了 我在网络中使用了一个非常快速的外部数据库服务器。我每秒要问1000个问题,服务器似乎没有什么印象(负载接近0) 在我的应用程序中,MySQLi链接被数据库类的析构函数关闭(这似乎工作正常) 我使用的是预先准备好的语句,还有两个守护进程运行着无限while循环和其中的一些查询(循环被usleep()延迟以防止过度使用,我必须注意,mysqli\u connect()

我正在编写一个hugh MySQLi/PHP应用程序,我的数据库遇到了问题,在运行了几个小时之后,似乎有太多的连接(250个)打开了

我在网络中使用了一个非常快速的外部数据库服务器。我每秒要问1000个问题,服务器似乎没有什么印象(负载接近0)

在我的应用程序中,MySQLi链接被数据库类的析构函数关闭(这似乎工作正常)

我使用的是预先准备好的语句,还有两个守护进程运行着无限while循环和其中的一些查询(循环被
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应用程序中。一点也不愚蠢。这在学校里很难教。