这是我第一次在这里提问。我已经搜索了 Google、stackoverflow 等,以寻求解决我遇到的问题的帮助。我们目前使用 PHP 5.3.10 & MySQL 5.0.95 和 Apache 2.2.21 (CentOS)。
我们正在开始从旧的 mysql 库切换到新代码中的 mysqli,我正在负责。我试过了
- 确保在完成后明确关闭与数据库的连接
- 完成后释放结果集
- 将连接限制从 150 增加到 250
有包含文件(与会话检查等有关)使用旧式 mysql_pconnect() 来验证某些事情。这些几乎包含在我们所有的代码中。
类似于代码的东西:
$mysqli = new mysqli('p:'.DBHOST, DBUSER, DBPASS, $_SESSION['dbname']);
if ($mysqli->connect_error) {
throw new Exception($mysqli->connect_error, $mysqli->connect_errno);
exit;
}
// do my stuff here, a bunch of SQL queries like:
$sql = 'SELECT * FROM MyTable';
$result = $mysqli->query($sql);
if (!$result) {
throw new SQLException($sql, $mysqli);
exit;
// SQLException is an extension to mysqli_sql_exception that adds the
// query into the messaging internally
}
while ($result && $row = $result->fetch_assoc()) {
// do stuff here, like show it on screen, etc., all works normally
}
$result->free(); // free up the result
$mysqli->close(); // close the connection to the database
释放结果并关闭连接是我在收到“连接太多”错误后所做的事情。在此之前,我每次运行程序时都会获得 3-4 个新的数据库连接。(通过 SHOW PROCESSLIST 在后端查看)
问题有所减轻(它增加了 0 到 3 个新连接,而不是每次增加 3 个新连接)。
我的一些阅读表明,如果当前线程中没有现有的空闲连接,这可能与 Apache 线程 + 添加的新持久连接有关。是这个吗?mysqli 不能很好地支持持久连接吗?(我应该放弃坚持吗?)
感谢您提出的任何建议。