我在 PHP 中使用 mysqli 类时遇到问题,并且无法在任何地方找到答案。
在我的脚本中,一个类创建了一个 mysqli 连接,并在其整个函数中使用该连接。之后,该脚本会 fork 。该连接也由子级使用,但是当子级死亡时,我遇到了父级中的连接被关闭(MYSQL Server 已消失)的问题。
在我切换到 mysqli 之前(只是使用 mysql),我只是调用 mysql_ping 以确保在父进程中执行查询之前数据库连接已存在。 Mysqli 有类似的 ping 功能,但如果连接消失,它实际上不会重新连接。我尝试使用 mysqli.reconnect=ON 全局设置,但没有成功(使用 php.ini 和 ini_set)。
php mysql_connect 函数允许您获取已经存在的连接,因此如果我使用 mysql 而不是 mysqli,我可以在进程 fork 后立即重用子级中的连接。但 mysqli 似乎没有任何这样的功能......
我唯一能做的就是调用 mysqli->ping() ,如果返回 false,则重新连接到父级中的数据库。这是非常低效的,我宁愿弄清楚如何使用 mysqli 正确地完成它(并且不需要手动重新连接),而必须改回 mysql..
有什么建议吗?
最佳答案
mysqli_ping()
的文档说,如果您将全局选项 mysqli.reconnect 设置为 1(在 php.ini 中),则 mysqli_ping()
当检测到连接消失时将重新连接。
更新:自从我在 2009 年回答这个问题以来,PHP 大多数情况下默认使用 mysqlnd 驱动程序,而不是 libmysql。正如下面的评论中提到的,mysqlnd 不支持 mysqli_ping()
函数,PHP 开发人员是故意这样做的,根据他们的“Won't Fix”回答https://bugs.php.net/bug.php?id=52561
因此 PHP 中似乎不再有自动重新连接的解决方案。
关于PHP mysqli 重新连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1468579/