这是我第一次在这里提问。我搜索了 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 不支持持久连接吗? (我该放弃坚持吗?)
感谢您提出的任何建议。