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;
}
加载更多