我在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 ..
有什么建议么?
的文件 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中的自动重新连接的问题。
的文件 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中的自动重新连接的问题。
你可以尝试一些不同的东西..而不是ping ..尝试发送一个非常简单的低强度查询,如“select now()”,看看你是否得到任何更好的结果。
你不能使用持久连接吗?另外,fork()真的有必要吗?
function IsConnected() {
if (empty($this->_connectionID) === FALSE && mysqli_ping($this->_connectionID) === TRUE) {
return true; // still have connect
}
$this->_connectionID = false;
return false; // lose connection
}
我认为你需要在my.cng中设置mysqli.reconnect,这是mysql配置,而不是php.ini,我无法通过ini_set改变重新连接,但是我的系统管理员在my.cnf中做到了。
所以,有点困惑,其他人已经在php.ini内完成了....