我在使用PHP中的mysqli类时遇到了问题,而且我在任何地方都找不到答案。
在我的脚本中,一个类创建了一个mysqli连接,它在整个函数中都会使用这个连接。之后,此脚本将派生。连接也被子节点使用,但我遇到了这样的问题:当子节点死亡时,父节点中的连接被关闭(MYSQL Server已经消失)。
在我切换到mysqli (只使用mysql)之前,我只是调用了mysql_ping来确保在父进程中执行查询之前数据库连接已经存在。Mysqli具有类似的ping功能,但如果连接断开,它实际上不会重新连接。我尝试使用mysqli.reconnect=ON全局设置,但没有成功(使用php.ini和ini_set)。
php mysql_connect函数允许您获取一个已经存在的连接,所以如果我使用mysql而不是mysqli,我可以在进程派生之后立即在子进程中重用该连接。但是mysqli似乎没有这样的功能……
我唯一能做的就是调用mysqli->ping(),如果返回false,则重新连接到父数据库。这是非常低效的,我更愿意弄清楚如何正确地使用mysqli (并且不需要手动重新连接),而不是必须改回mysql。
有什么建议吗?
发布于 2009-09-24 07:18:21
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中的"Won't Fix“答案故意这样做
因此,在PHP中似乎没有自动重新连接的解决方案。
发布于 2009-09-24 01:45:29
你可以尝试一些不同的东西..而不是ping ..试着发送一个非常简单的低强度查询,比如"select now()“,看看能不能得到更好的结果。
发布于 2009-09-24 07:39:23
你不能使用持久连接吗?另外,fork()真的有必要吗?
https://stackoverflow.com/questions/1468579
复制相似问题