1

这是我第一次在这里提问。我已经搜索了 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 不能很好地支持持久连接吗?(我应该放弃坚持吗?)

感谢您提出的任何建议。

4

1 回答 1

1

我没有使用 mysqli 持久连接的经验,但是您的一些问题和期望对我来说看起来很奇怪。

mysqli 使用 p: connect 选项打开多个新进程

是的,这就是永久连接的用途

确保在完成后明确关闭与数据库的连接

你不能确保你明确地关闭它,因为你不能这样做。再次因为永久连接的唯一点是持续打开

每次运行我的程序时,我都会获得 3-4 个新的数据库连接。

所以,你必须确保你只打开一个。

  • 您的脚本至少有两个连接 - 一个旧样式和一些来自 mysqli?
  • 实例化了多少个 mysqli 对象?
  • 运行多少个 php 脚本来服务一个 HTTP 请求?你确定吗?

毕竟,如果它让你如此困扰,你为什么要使用持久连接?你有什么真正的(不是想象的)好处吗?毕竟,如果你的版本是 5.3,为什么还要从 mysql 重写呢?

于 2013-03-14T04:20:27.067 回答