我正在编写一个休眠的MySQLi / PHP应用程序并遇到数据库问题,似乎在运行几个小时之后打开了太多的连接(250)。
我在网络中使用非常快速的外部数据库服务器。我每秒达到1000个问题,服务器似乎没有留下深刻印象(负载接近0)。
在我的应用程序中,MySQLi链接被数据库类的析构函数关闭(这似乎正常工作)。
我正在使用预处理语句,并且还有几个守护进程在无限循环中运行,并且其中有一些查询(循环使用usleep()
延迟以防止过度使用,我必须注意到{{1} }只在启动守护进程时调用。)
但似乎我从未用mysqli_connect()
关闭我准备好的陈述。在我的数据库中的查询统计信息下,我可以看到stmt->close()
个问题的数量等于stmt->close()
的数量。这可能是问题,我什么时候必须关闭我的stmt?我不知道在哪里可以找到解决这个问题的方法。
软件版本
使用MySQL 5.6的CentOS 6.5下的PHP 5.5
答案 0 :(得分:2)
以下是一些尝试:
首先:在你的无限循环守护进程中:在睡觉前关闭你的连接,并在醒来时再次打开它们。不要试图长时间保持数据库连接打开。客户端 - 服务器连接中的各种超时逻辑可能会在您不想要它时激活,从而给您带来不可预测的故障。打开连接,使用它们然后关闭它们将避免这种情况。
第二:尝试使用所谓的持久连接。在mysqli
中,您可以在您的主机名前添加p:
来执行此操作。阅读:http://www.php.net/manual/en/mysqli.persistconns.php
第三:优秀的做法是close()
明确表达你准备好的陈述,如果你重复使用它们之间的reset()
。 mysqli dtor应该自动执行此操作,但它仍然是很好的做法
第四:您可能希望配置Apache或ngnix服务器软件以生成更少的实例和线程。这些实例和/或线程是可串行恢复的资源,Linux的TCP堆栈可以很好地排队连接请求。这应该减少MySQL需要处理的连接数。
第五:你是否需要改变MySQL的配置以允许超过250个连接?如果您要将网络流量负载平衡到大量网络服务器,则可能需要这样做。
祝贺获得大量流量!现在为了一些真正的乐趣。 bwahahaha。