我们有几台不同的服务器运行相同的 PHP 脚本,所有这些都使用 PHP mysqli 连接/函数,我们注意到,在一台新服务器上,我们开始收到许多 MYSQL Gone Away 错误。
wait_timeout
在 MYSQL 中,在所有服务器上都设置为 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。