我们有几个不同的服务器运行相同的PHP脚本,所有这些服务器都使用PHP mysqli连接/函数,我们注意到,在一台新服务器上,我们开始收到许多MYSQL Gone Away错误。
在所有服务器上,MYSQL中的wait_timeout设置为300秒,这是在此特定服务器上的连接断开之前所需的时间长度(即,在下面的代码中,两次查询之间的等待时间为301秒,但299秒不会产生错误)。
但是,所有服务器也将mysqli.reconnect设置为1(开)。根据文档,mysqli.reconnect应该意味着断开的连接是自动重新连接的,但它肯定不是。
下面是我运行的演示该问题的代码片段。它可以在除此特定服务器之外的所有服务器上运行:
$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。
发布于 2013-02-19 18:20:18
原来问题出在MYSQLND驱动程序上。我们的服务提供商基本上重新编译了PHP,这解决了问题。
发布于 2014-09-27 07:46:51
有一个关于这个问题的php bug,已经解决了:https://bugs.php.net/bug.php?id=52561
发布于 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()保存/禁用/恢复设置,如下所示:
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...
}https://stackoverflow.com/questions/14936616
复制相似问题