PHP mysqli 重新连接问题

标签 php mysqli fork reconnect

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

相关文章:

c - 使用 fork() 和 IPC 在 C 中最有效的矩阵乘法

c - 并行归并排序(使用fork)

php - LARAVEL 如何从特征中更改模型中的 $fillable?

javascript - 如何调用包含在 PHP 文件或 Javascript 文件中的 'conscruct of functions'?

php - 我应该如何处理用户名已被使用的情况?

php - 在 PHP 7.0.7 上安装 MySQLi 和 pgsql 扩展

php - 数据库同步或迁移工具

Javascript true 条件未执行

php - 无法使用 mysqli 创建过程,但可以使用 phpmyadmin?

c++ - 僵尸进程和 fork