PHP mysqli重新连接问题

时间:2009-09-23 21:22:52

标签: php mysqli fork reconnect

我在PHP中使用mysqli类时遇到了麻烦,但我无法在任何地方找到答案。

在我的脚本中,一个类创建了一个mysqli连接,它在整个函数中使用它。之后,这个脚本分叉。孩子们也使用这种连接,但是当孩子们死亡时,我遇到了父母关闭连接(MYSQL服务器已经消失)的问题。

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

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

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

有什么建议吗?

6 个答案:

答案 0 :(得分:14)

mysqli_ping()的文档说,如果将全局选项 mysqli.reconnect 设置为1(在php.ini中),则mysqli_ping()会在检测到时重新连接连接消失了。

更新:自从我在2009年回答了这个问题以来,PHP大部分都是默认使用 mysqlnd 驱动程序而不是 libmysql 。正如下面的评论所述, mysqlnd 不支持mysqli_ping()函数,并且PHP开发人员根据https://bugs.php.net/bug.php?id=52561中的“无法修复”答案故意这样做了

因此,似乎没有解决PHP中的自动重新连接的问题。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分: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
}

答案 4 :(得分:-1)

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

答案 5 :(得分:-2)

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

所以,有点混淆其他人已经在php.ini中完成了它。