[警告]:PDO :: __ construct():MySQL服务器已经消失 - wait_timeout不是原因?

时间:2011-09-01 09:31:01

标签: mysql pdo

我希望有人可以帮助解决我在网络服务器上遇到的问题。目前,服务器托管我们为帮助台购买的Web应用程序。当有人导航到该页面时,每8个小时,他们将收到此错误:

[Warning]: PDO::__construct(): MySQL server has gone away (Database/class.SWIFT_Database.php:334)

我已尝试将wait_timeout设置为/etc/my.cnf文件中的最大值,即

wait_timeout=31536000

同样从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)

我发现这对于很多在线运行mysql的各种web应用程序来说都是一个问题,但似乎没有人能解决这个问题。网上有很多建议指向wait_timeout,但它似乎没有改变我所看到的错误。我已经尝试了关于这个问题的mysql手册的修复,但仍然没有运气(链接:http://dev.mysql.com/doc/refman/5.0/en/gone-away.html

任何建议都将不胜感激。服务器详细信息和产品版本如下:

服务器:OpenSuse 11.4 MySql版本:5.1.53

非常感谢提前!

3 个答案:

答案 0 :(得分:6)

虽然不是很优雅,但以下片段帮助我摆脱了超时并保持持久连接。如果连接连续失败$ 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;
    }
}

答案 1 :(得分:1)

Drupal.org上的

This article可能对您的情况有所帮助:

  

MySQL附带了它将要使用的资源的默认配置,在安装MySQL期间在“my.cnf”(Linux)或“my.ini”(Windows)中指定。

     

在Linux中,此文件位于/etc/my.cnf以设置全局选项,或/usr/local/var/mysql-data-dir/my.cnf以设置特定于服务器的选项。

     

在Windows中,此文件默认位于C:\Program Files\MySQL\MySQL Server X.Y\my.ini

     

默认配置允许的资源通常不足以运行资源密集型应用程序。如果原始配置文件中提供了以下资源规范,则必须修改它们,或者如果尚未指定它们,则必须将它们添加到配置文件中(因为默认情况下不存在某些资源规范):

     

重要提示:请记住在执行任何操作之前保留备份文件!在更改这些配置文件后,您还必须重新加载MySQL服务。

     

MyISAM规范:

[mysqld]
port = 3306
socket = /tmp/mysql.sock
skip-external-locking
key_buffer = 384M
max_allowed_packet = 64M
table_cache = 4096
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 64M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M
  

InnoDB规范:

innodb_buffer_pool_size = 384M
innodb_additional_mem_pool_size = 20M
innodb_log_file_size = 10M
innodb_log_buffer_size = 64M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 180
  

注意:这里假设您正在使用InnoDB数据库表,因为Drupal是一个资源密集型应用程序。如果您没有使用InnoDB数据库表,请尝试更改此信息,因为您收到了警告:MySQL服务器已经消失 - 显然意味着您的设置是资源密集型的。

答案 2 :(得分:1)

连接关闭的原因有多种。

参考: https://dev.mysql.com/doc/refman/5.0/en/gone-away.html

我也遇到了使用PDO的类似问题,如果主机管理员睡眠超过一分钟,主机管理员就会终止连接。因此,我想出了自己的类,它将包装PDO类。这将检测连接是否已关闭,并将尝试重新连接查询执行。

回答

PDO: MySQL server has gone away