ThinkPHP出现Generalerror:2006MySQLserverhasgone。。。错误:
#13 {main}SQLSTATE[HY000]: General error: 2006 MySQL server has gone away
FILE: \ThinkPHP\Library\Think\Db\Driver.class.php(169)
原因分析:
本次错误提⽰是在cli模式运⾏,隔⼀段时间就会出现,查询资料后发现mysql默认没隔8个⼩时(2880000秒)就会断开
解决⽅案,解决⽅式了三个
⽅法1
  配置mysqlf(windows系统则是my.ini),指定wait_timeout和interactive_timeout,设置⼀个⽐较⼤的值,⽐如⼀年(86400*365)。
⽅法2
  链接后通过执⾏命令来指定本次链接的wait_timeout和interactive_timeout,原理跟【1】⼀样,只不过这
种⽅式只影响本次链接,⽅式【1】会影响所有链接。
但是thinkphp已经封装好了数据库驱动,所以不好单独指定某⼀次。我的做法是判断php_sapi,如果是cli则设置wait_timeout和interactive_timeout
// ThinkPHP\Library\Think\Db\Driver.class.php 第 105⾏
if(PHP_SAPI == 'cli'){
$query = $this->linkID[$linkNum]->prepare("set session wait_timeout=31536000,interactive_timeout=31536000,net_read_timeout=10000");
$query->execute();
}
⽅法3
既然是超时断开了,那我们就可以采取断线重连的⽅式
// ThinkPHP\Library\Think\Db\Driver.class.php 第 105⾏
$this->linkID[$linkNum]->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);server error翻译
$this->linkID[$linkNum]->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
$this->linkID[$linkNum]->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
// ThinkPHP\Library\Think\Db\Driver.class.php 第159⾏(query⽅法)和 220⾏(execute⽅法)
try {
$this->PDOStatement = $this->_linkID->prepare($str);
} catch (\PDOException $e) {
// 断线重连
if ($e->errorInfo[1] == 2006 || $e->errorInfo[1] == 2013) {
echo "---> \n";
$this->linkID = array();
$this -> _linkID = null;
$this->initConnect(false);
$this->PDOStatement = $this->_linkID->prepare($str);
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。