php - MySQL(i) "Too many connections"怎么办?

标签 php mysql mysqli

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

我在我的网络中使用了一个非常快速的外部数据库服务器。我每秒处理大约 1000 个问题,但服务器似乎并没有给我留下深刻印象(负载接近于 0)。

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

我正在使用准备好的语句,还有几个运行着无限 while 循环的守护进程和其中的一些查询(循环被 usleep() 延迟以防止过度使用,我必须注意mysqli_connect() 仅在启动守护程序时调用)。

但似乎我从来没有用stmt->close() 关闭我准备好的语句。在我的数据库中的查询统计信息下,我可以看到 stmt->close() 问题的数量等于 stmt->execute() 的数量。那么这可能是问题吗?例如,我什么时候必须关闭我的 stmt?我不知道在哪里可以找到这个问题的解决方案。

软件版本

CentOS 6.5 下的 PHP 5.5 和 MySQL 5.6

最佳答案

这里有一些尝试:

首先:在你的无限循环守护进程中:在 sleep 前关闭你的连接并在醒来时再次打开它们。不要试图长时间保持数据库连接打开。客户端-服务器连接中有各种超时逻辑,它们可能会在您不希望它激活时激活,因此会给您带来不可预测的故障。打开连接,使用它们,然后关闭它们将避免这种情况。

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

第三:最好的做法是在你完成准备好的语句时显式地close(),如果你重用它们,则在使用之间reset()它们他们。 mysqli dtor 应该会自动执行此操作,但这仍然是一个很好的做法

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

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

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

关于php - MySQL(i) "Too many connections"怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24654726/

相关文章:

PHP - session 变量性能( session 变量与读取文件)

php - Joomla 3.2.1密码加密

php - 使用复选框打开和关闭颜色 div

java - 无法获取 JDBC 连接;嵌套异常是 java.sql.SQLException : Cannot load JDBC driver class 'org.hsql.jdbcDriver'

mysql - 在 Apache::Sessions:MySQL session 中存储一个复杂的散列

php - PHP mysql 和 mysqli 模块连接到同一数据库可以安全地并行使用吗?

php - 使用 PHP 将任何给定的 MySQL SELECT 查询显示为 HTML 表

MySQL ODBC 3.51 驱动 UTF-8 编码

PHP 多个同时选择?

php - mysqli_fetch_assoc()需要参数/调用成员函数bind_param()错误。如何获取并修复实际的mysql错误?