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

Are*_*ijk 5 php mysql mysqli

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

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

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

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

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

软件版本

使用MySQL 5.6的CentOS 6.5下的PHP 5.5

O. *_*nes 2

这里有一些可以尝试的事情:

第一:在无限循环守护进程中:在睡觉前关闭连接,并在醒来时再次打开它们。不要尝试长时间保持数据库连接打开。客户端-服务器连接中存在各种超时逻辑,这些逻辑可能会在您不希望时激活,从而导致不可预测的失败。打开连接,使用它们,然后关闭它们可以避免这种情况。

第二:尝试使用所谓的持久连接。mysqli您可以在p:主机名前面添加来执行此操作。阅读此内容:http ://www.php.net/manual/en/mysqli.persistconns.php

close()第三:在完成准备好的语句后明确地处理这些语句是一个很好的做法,reset()如果您重用它们,则在使用它们之间也可以明确地处理它们。mysqli dtor 应该自动执行此操作,但这仍然是一个很好的做法

第四:您可能需要配置 Apache 或 ngnix 服务器软件以生成更少的实例和线程。这些实例和/或线程是连续可重用的资源,Linux 的 TCP 堆栈在为它们排队连接请求方面做得很好。这应该会减少 MySQL 需要处理的连接数量。

第五:是否需要更改 MySQL 的配置以允许超过 250 个连接?如果您要将 Web 流量负载平衡到许多 Web 服务器,则可能需要这样做。

恭喜您获得大量流量!现在来点真正的乐趣吧。哇哈哈。