我希望这里有人可以帮助解决我在网络服务器上遇到的问题.目前,服务器托管我们为帮助台购买的Web应用程序.每当有人导航到该页面时,每隔8小时就会出现以下错误:
[Warning]: PDO::__construct(): MySQL server has gone away (Database/class.SWIFT_Database.php:334)
Run Code Online (Sandbox Code Playgroud)
我已经尝试将wait_timeout设置为/etc/my.cnf文件中的最大值,即;
wait_timeout=31536000
Run Code Online (Sandbox Code Playgroud)
同样从mysql我将全局wait_timeout设置为此值并将session wait_time设置为相同.
我注意到一些奇怪的行为,当你重新启动mysql服务时,等待超时重置为28800默认值,尽管它在my.cnf中设置.我找不到mysql的任何其他配置文件,但很高兴看到有人能指出我的方向.
今天早上当我登录服务器并运行以下命令时,会话wait_timeout值已恢复!
mysql> select @@global.wait_timeout, @@session.wait_timeout;
+-----------------------+------------------------+
| @@global.wait_timeout | @@session.wait_timeout |
+-----------------------+------------------------+
| 31536000 | 28800 |
+-----------------------+------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
我看到这对很多人来说都是一个问题,在mysql上运行各种各样的webapps,但似乎没有人有修复.网上有很多建议指向wait_timeout,但它似乎没有改变我所看到的错误.我已经尝试了关于这个问题的mysql手册的修复,但仍然没有运气(链接:http://dev.mysql.com/doc/refman/5.0/en/gone-away.html)
任何建议将不胜感激.服务器详情和产品版本如下:
服务器:OpenSuse 11.4 MySql版本:5.1.53
提前谢谢了!
虽然不是很优雅,但以下片段帮助我摆脱了超时并保持持久的联系.如果连接连续失败$ limit次数,它将抛出异常,但如果问题是超时,则最多只需要重试1次.
$db = null;
$limit = 10;
$counter = 0;
while (true) {
try {
$db = new PDO('mysql:host=' . db_host . ';dbname=' . db_name, db_user, db_pass);
$db->exec( "SET CHARACTER SET utf8" );
$db->setAttribute( PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC );
$db->setAttribute( PDO::ATTR_PERSISTENT, true );
break;
}
catch (Exception $e) {
$db = null;
$counter++;
if ($counter == $limit)
throw $e;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14894 次 |
| 最近记录: |