ThinkPHP出现General error: 2006 MySQL server has gone away的解决方法

错误:

#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

  配置mysql.cnf(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);
$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 "---> db reconnecting...\n";
                $this->linkID = array();
                $this -> _linkID = null;
                $this->initConnect(false);
                $this->PDOStatement = $this->_linkID->prepare($str);
            }
        }

原文地址:https://www.cnblogs.com/dragondean/p/8428597.html

时间: 2024-08-26 03:15:05

ThinkPHP出现General error: 2006 MySQL server has gone away的解决方法的相关文章

MySQL(Navicat)运行.sql文件时报错:[Err] 2006 - MySQL server has gone away 的解决方法

Message: MySQL server has gone away 原因可能是sql语句过长,超过mysql通信缓存区最大长度: 调整mysql配置文件中max_allowed_packet 编辑mysql.ini max_allowed_packet=16M 重启mysql

mysql error: (2006, 'MySQL server has gone away')

max_allowed_packet=16M wait_timeout=400000 interactive_timeout = 400000 vim /etc/my.cnf  mysqld 中加入上面的内容. mysql error: (2006, 'MySQL server has gone away')

mysql导入大批量数据时,出现ERROR : (2006, 'MySQL server has gone away')

mysql导入数据时,出现ERROR : (2006, 'MySQL server has gone away') 解决方案:官方解释是适当增大 max_allowed_packet 参数可以使client端到server端传递大数据时,系统能够分配更多的扩展内存来处理. 设置 max_allowed_packet = 256M (1024*1024*256) set global max_allowed_packet=268435456; 使用set global命令修改 max_allowe

mysql导入sql文件报错“MySQL server has gone away”的解决方法

登陆mysql终端,查看当前配置(默认单位是字节): show VARIABLES like '%max_allowed_packet%'; 在mysql的安装目录下 找到 my.ini文件 加入以下代码: interactive_timeout = 120 wait_timeout = 120 max_allowed_packet = 32M

MySQL server has gone away的解决方法

用跑python 写了一个链接mysql数据库的类,发现过了一天链接就断掉了,原来mysql有一个超时时间的设置 查看超时设置: show global variables like '%timeout%'; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +----------------------------+-------+ | Variable_name              | Value | +----------------------------+-

mysql导入大批量数据出现MySQL server has gone away的解决方法

学习了:https://blog.csdn.net/fdipzone/article/details/51974165 https://blog.csdn.net/nthack5730/article/details/50043277 原文地址:https://www.cnblogs.com/stono/p/9139361.html

SQLyog恢复数据库报错解决方法【Error Code: 2006 - MySQL server has gone away】

https://blog.csdn.net/niqinwen/article/details/8693044 导入数据库的时候 SQLyog 报错了 Error Code: 2006 – MySQL server has gone away 搜了下,说是max_allowed_packet (MySQL的一个参数)设置的值不够大. 那我改下就行了 嘿嘿 In Windows: In the MySQL server installation directory,in my.ini file, a

#2006 - MySQL server has gone away

#2006 - MySQL server has gone away 对于web应用来说,经常会用到mysql,而数据的备份与还原是web应用经常做的事,一般来说,用客户端工具phpmyadmin,sqlyog 等,来备份数据库没有任何问题,还原时经常碰到mysql提示的#2006错误. Error: 2006 (CR_SERVER_GONE_ERROR) Message: MySQL server has gone away 原因可能是sql语句过长,超过mysql通信缓存区最大长度: 调整m

MySQL导入sql脚本错误:2006 - MySQL server has gone away

下面我给各位同学介绍在mysql中导入数据库时提示MySQL server has gone away问题的解决方法,如果你碰到mysql提示MySQL server has gone away错误我们可进入参考. 到如一些小脚本很少报错,但最近导入一个10+M的SQL脚本,却重复报错: Error occured at:2014-03-24 11:42:24Line no.:85Error Code: 2006 - MySQL server has gone away 最终找到原因,原来是My