【发布时间】:2013-02-18 12:42:36
【问题描述】:
我们有几台不同的服务器运行相同的 PHP 脚本,所有这些都使用 PHP mysqli 连接/函数,我们注意到,在一台新服务器上,我们开始收到许多 MYSQL Gone Away 错误。
wait_timeout 在 MYSQL 中在所有服务器上设置为 300 秒,这是在此特定服务器上连接断开之前所需的时间长度(即下面代码中的查询之间等待 301 秒会产生错误,但 299 秒没有)。
但是,所有服务器也将mysqli.reconnect 设置为 1(打开)。根据文档,mysqli.reconnect 应该意味着断开的连接会自动重新连接,但绝对不是。
这是我运行的代码 sn-p 来演示该问题。它适用于除此特定服务器之外的所有服务器:
$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。
【问题讨论】:
-
您可能会从某个地方获得一个压倒一切的设置。您是否检查过新服务器上的多个 my.cnf 文件?
-
当我在服务器上执行
echo ini_get('mysqli.reconnect');时(命令行和通过网络浏览器),设置总是显示为“1”(打开),所以在运行时 PHP 肯定有正确的值。是否存在可能导致重新连接不起作用的 MySQL 配置设置? -
确实有一种方法可以控制从 MySQL 端自动重新连接 - dev.mysql.com/doc/refman/5.0/en/auto-reconnect.html - 我假设所有服务器都使用相同的数据库服务器,所以我认为这是一个可能的原因。
-
他们都连接到同一个数据库服务器,对不起,我的错!
-
Craig,您能否更新您的代码 sn-p 以显示您最新的测试脚本?塔