首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么会导致PHP忽略mysqli.reconnect设置?

什么会导致PHP忽略mysqli.reconnect设置?
EN

Stack Overflow用户
提问于 2013-02-18 20:42:37
回答 3查看 2.4K关注 0票数 2

我们有几个不同的服务器运行相同的PHP脚本,所有这些服务器都使用PHP mysqli连接/函数,我们注意到,在一台新服务器上,我们开始收到许多MYSQL Gone Away错误。

在所有服务器上,MYSQL中的wait_timeout设置为300秒,这是在此特定服务器上的连接断开之前所需的时间长度(即,在下面的代码中,两次查询之间的等待时间为301秒,但299秒不会产生错误)。

但是,所有服务器也将mysqli.reconnect设置为1(开)。根据文档,mysqli.reconnect应该意味着断开的连接是自动重新连接的,但它肯定不是。

下面是我运行的演示该问题的代码片段。它可以在除此特定服务器之外的所有服务器上运行:

代码语言:javascript
复制
$mysqli = new mysqli('ip', 'username', 'pass', 'db');
if (mysqli_connect_errno()) {
  printf("Connect failed: %s\n", mysqli_connect_error());
  exit();
}

$query = "SELECT * FROM table LIMIT 1";
$result = $mysqli->query($query) or die($mysqli->error.__LINE__);
sleep(301);
$query = "SELECT * FROM table LIMIT 1";
$result = $mysqli->query($query) or die($mysqli->error.__LINE__);
mysqli_close($mysqli);

print "Finished\n";
exit;

我还重写了测试脚本以使用mysqli_ping() (因为文档指出,如果mysqli.reconnect设置为1,则此函数应自动重新连接),但是这仍然不会重新连接,并且第二个查询总是产生MySQL已消失的错误。

所有服务器运行的PHP版本略有不同。出现故障的服务器正在运行5.3.21,其他服务器正在运行5.3.0和5.3.10。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-19 18:20:18

原来问题出在MYSQLND驱动程序上。我们的服务提供商基本上重新编译了PHP,这解决了问题。

票数 2
EN

Stack Overflow用户

发布于 2014-09-27 07:46:51

有一个关于这个问题的php bug,已经解决了:https://bugs.php.net/bug.php?id=52561

票数 1
EN

Stack Overflow用户

发布于 2019-05-18 05:54:12

我是在查找有关mysqli.reconnect设置的信息时遇到这个问题的。根据手册:

https://www.php.net/manual/en/mysqli.configuration.php#ini.mysqli.reconnect

注意:此php.ini设置被mysqlnd驱动程序忽略。

这并没有说明这是否意味着它总是会,或者总是不会,自动重新连接。“不会”似乎更有可能,上面的评论证实了这一点,并指出当设置为1时不会发生。

我的问题是,我想要一种知道连接何时终止的方法(用于错误报告目的,这样我就可以在这种情况下有选择地重试失败的数据库操作)。我不知道是否有更直接的方法来检查DB连接是否处于活动状态,但我找到了mysqli::ping()方法。除非,如果它静默地自动重新连接,我就不会知道它已经发生了。

因此,我的解决方案是使用ping()保存/禁用/恢复设置,如下所示:

代码语言:javascript
复制
if (!$result) { // DB operation failed
    $save = ini_get('mysqli.reconnect'); // save setting
    ini_set('mysqli.reconnect', 0); // disable it
    $connected = $mysqli->ping(); // check connection
    ini_set('mysqli.reconnect', $save); // restore setting
}
if ($connected) {
    // Failure was something else. Handle that...
} else {
    // Failure was due to dropped connection.
    // Explicitly reconnect.
    // Ok to retry operation...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14936616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档