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类里的,请自行修改。* ~~~php ...... //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获取域名非访问地址域名问题

下一篇:  有点看不懂了

加载更多