问题 PHP mysqli重新连接问题


我在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 ..

有什么建议么?


9317
2017-09-23 21:22


起源



答案:


的文件 mysqli_ping() 如果你设置了全局选项 mysqli.reconnect 到1(在你的php.ini中)然后 mysqli_ping() 将在检测到连接消失后重新连接。

更新:自从我在2009年回答这个问题以来,PHP已经大部分继续使用了 mysqlnd 默认驱动程序而不是 的libmysql。如下面的评论所述, mysqlnd 不支持 mysqli_ping() 功能,并且PHP开发人员故意这样做,根据他们的“Will Not Fix”答案 https://bugs.php.net/bug.php?id=52561

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


13
2017-09-24 07:18



那很有效。我没有意识到你不能使用ini_set来修改这个变量,而且我是天才,我之前把这行添加到了php.ini,不知道已经有一个mysli.reconnect = Off line down the down文件。但删除那个只是使用mysqli.reconnect工作,使mysqli-> ping()执行就像mysql_ping。谢谢您的帮助! - Evan Carothers
mysqlnd显然不支持mysqli_ping(),请参阅 bugs.php.net/bug.php?id=52561 - Damien Ó Ceallaigh


答案:


的文件 mysqli_ping() 如果你设置了全局选项 mysqli.reconnect 到1(在你的php.ini中)然后 mysqli_ping() 将在检测到连接消失后重新连接。

更新:自从我在2009年回答这个问题以来,PHP已经大部分继续使用了 mysqlnd 默认驱动程序而不是 的libmysql。如下面的评论所述, mysqlnd 不支持 mysqli_ping() 功能,并且PHP开发人员故意这样做,根据他们的“Will Not Fix”答案 https://bugs.php.net/bug.php?id=52561

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


13
2017-09-24 07:18



那很有效。我没有意识到你不能使用ini_set来修改这个变量,而且我是天才,我之前把这行添加到了php.ini,不知道已经有一个mysli.reconnect = Off line down the down文件。但删除那个只是使用mysqli.reconnect工作,使mysqli-> ping()执行就像mysql_ping。谢谢您的帮助! - Evan Carothers
mysqlnd显然不支持mysqli_ping(),请参阅 bugs.php.net/bug.php?id=52561 - Damien Ó Ceallaigh


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


0
2017-09-24 01:45



可能有帮助的原因... mysql认为你是一个活跃的用户而不是只是持有连接和占用资源的人..我相信my.ini / my.cnf中有一些超时设置会影响这种行为。如果你有权访问,你也可以查看它。 - Sabeen Malik


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


0
2017-09-24 07:39





function IsConnected() {
    if (empty($this->_connectionID) === FALSE && mysqli_ping($this->_connectionID) === TRUE) {
        return true; // still have connect
    }
    $this->_connectionID = false;
    return false; // lose connection
}

0
2018-03-19 04:26





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


-1
2017-09-23 23:18



重新安装PHP将是一个矫枉过正。在网络上找到一个默认的php.ini并检查你的php.ini已经改变了多少。 - Phalgun


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

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


-2
2017-11-29 13:33



不对。 my.cnf 仅涉及MySQL服务器,因此通常对PHP客户端没有影响,并且 mysqli 仅存在于PHP中。mysqli.reconnect  是 PHP配置设置。 - Synchro