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

时间:2013-03-13 21:38:05

标签: php mysqli

这是我第一次在这里提问。我已经搜索过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

释放结果并关闭连接是我在收到“Too many connections”错误后所做的事情。在此之前,每次运行程序时,我都会获得3-4个新的数据库连接。 (在SHOW PROCESSLIST的后端查看)

问题有所减轻(它增加了0到3个新连接,而不是每次增加3个新连接)。

我的一些阅读建议,如果当前线程中没有现有的空闲连接,这可能与Apache线程+添加新的持久连接有关。是这个吗? mysqli是否支持持久连接? (我应该放弃持久性吗?)

感谢你提出的任何建议。

1 个答案:

答案 0 :(得分:1)

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

  

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

是的,这就是

的永久连接
  

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

您无法确保明确关闭它,因为您无法这样做。再次因为永久连接的唯一要点就是持续打开

  

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

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

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

毕竟,如果你这么烦恼,为什么你要使用持久连接?你有什么真正的(不是想象的)好处吗? 毕竟,如果你的版本是5.3,为什么还要费心去重写mysql?