MySQL server has gone away问题解决方案

作者:zarte    发布时间: 2018-06-04

phpmysql

问题分析

mysql提示MySQL server has gone away有多种原因:

1.mysqld线程被杀死.
2.使用了关闭的链接资源
3.无权限
4.TCP/IP超时
5.mysql服务器端超时
6.windows兼容问题
7.sql过长
8.请求包过长
9.DNS解析问题
10.多进程并发使用同一个链接
11.mysql的未知bug

解决方案

根据不同问题有不同方案,这里先写两点遇到过的解决方案。

第一个:
sql过长,执行时间太长
这类比较简单在my.cnf文件中添加或者修改以下两个变量: wait_timeout=2880000
interactive_timeout = 2880000
时间调足够长即可

interactive_timeout针对交互式连接,
wait_timeout针对非交互式连接。
所谓的交互式连接,即在mysql_real_connect()函数中使用了CLIENT_INTERACTIVE选项。

第二个:
使用了关闭的链接资源
没建立连接情况不谈,这里说下使用php守护进程调用数据库间隔太久导致连接被关闭的问题。
思路就是检测连接,不可用的时候重新连接。pdo没有ping方法需要自己实现

下面的代码包在pdo类里的,请自行修改。

......
//ping检测
public function pdo_ping(){
        try{
            $this->dbh->getAttribute(PDO::ATTR_SERVER_INFO);
        //因为warning无法被catch,所以需要判断错误信息手动抛出错误。
           if ($this->dbh->errorCode() != '00000') {
                $arrayError = $this->dbh->errorInfo();
                throw new Exception('MySQL Error: '.$arrayError[2]);
            }
        } catch (PDOException $e) {
            if(strpos($e->getMessage(), 'MySQL server has gone away')!==false){
                return false;
            }
        }
        return true;
    }
//重连
 public function reconnect($dbHost, $dbUser, $dbPasswd, $dbName, $dbCharset){
        self::$_instance = new self($dbHost, $dbUser, $dbPasswd, $dbName, $dbCharset);
        return self::$_instance;
    }

上一篇:  php获取域名非访问地址域名问题

下一篇:  windows监听端口外网无法访问

加载更多