我在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 ..
有什么建议吗?
答案 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中完成了它。