MySQL(i)"连接太多"该怎么办?

时间:2014-07-09 13:14:25

标签: php mysql mysqli

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

我在网络中使用非常快速的外部数据库服务器。我每秒达到1000个问题,服务器似乎没有留下深刻印象(负载接近0)。

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

我正在使用预处理语句,并且还有几个守护进程在无限循环中运行,并且其中有一些查询(循环使用usleep()延迟以防止过度使用,我必须注意到{{1} }只在启动守护进程时调用。)

但似乎我从未用mysqli_connect()关闭我准备好的陈述。在我的数据库中的查询统计信息下,我可以看到stmt->close()个问题的数量等于stmt->close()的数量。这可能是问题,我什么时候必须关闭我的stmt?我不知道在哪里可以找到解决这个问题的方法。

软件版本

使用MySQL 5.6的CentOS 6.5下的PHP 5.5

1 个答案:

答案 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。