14

我在 PHP 中使用 mysqli 类时遇到问题,我无法在任何地方找到答案。

在我的脚本中,一个类创建了一个 mysqli 连接,它在整个函数中使用。之后,此脚本分叉。孩子们也使用该连接,但是当孩子们死亡时,我遇到了在父母中关闭连接(MYSQL Server Has Gone Away)的问题。

在我切换到 mysqli(只是使用 mysql)之前,我只是调用了 mysql_ping 以确保在父进程中执行查询之前存在 db 连接。Mysqli 具有类似的 ping 功能,但如果连接消失,它实际上不会重新连接。我尝试使用 mysqli.reconnect=ON 全局设置但没有成功(使用 php.ini 和 ini_set)。

php mysql_connect 函数允许您获取一个已经存在的连接,所以如果我使用 mysql 而不是 mysqli,我可以在进程分叉后立即在子进程中重用该连接。但是 mysqli 似乎没有任何这样的功能......

我唯一能做的就是调用 mysqli->ping() 如果返回 false 然后重新连接到父数据库。这是非常低效的,我宁愿弄清楚如何用 mysqli 正确地做到这一点(并且不需要手动重新连接)必须改回 mysql ..

有什么建议么?

4

6 回答 6

16

The doc for mysqli_ping() says that if you set the global option mysqli.reconnect to 1 (in your php.ini) then mysqli_ping() will reconnect when it detects the connection has gone away.

Update: Since I answered this question in 2009, PHP has mostly moved on to use the mysqlnd driver by default instead of libmysql. As mentioned in the comment below, mysqlnd does not support the mysqli_ping() function, and the PHP developers did this intentionally, according to their "Won't Fix" answer in https://bugs.php.net/bug.php?id=52561

So there appears to be no solution for automatic reconnect in PHP anymore.

于 2009-09-24T07:18:20.567 回答
0
function IsConnected() {
    if (empty($this->_connectionID) === FALSE && mysqli_ping($this->_connectionID) === TRUE) {
        return true; // still have connect
    }
    $this->_connectionID = false;
    return false; // lose connection
}
于 2013-03-19T04:26:56.747 回答
0

你不能使用持久连接吗?另外, fork() 真的有必要吗?

于 2009-09-24T07:39:22.753 回答
0

你可以尝试一些不同的东西......而不是ping ..尝试发送一个非常简单的低强度查询,如“现在选择()”,看看你是否得到更好的结果。

于 2009-09-24T01:45:29.427 回答
-1

使用http://www.php.net/manual/en/mysqli.real-connect.php ...重新安装 php 并检查您的 php.ini 设置

于 2009-09-23T23:18:01.370 回答
-2

我认为您需要在 my.cng 中设置 mysqli.reconnect,这是 mysql 配置,而不是 php.ini,我无法通过 ini_set 更改重新连接,但我的系统管理员在 my.cnf 中完成了。

所以,有点困惑,其他人已经在 php.ini 中完成了......

于 2011-11-29T13:33:36.453 回答