目录
当我们长时间运行一个脚本时,例如爬虫、workman服务等,发起mysql 查询时,会提示“MySQL server has gone away”错误。详情可见《MySQL server has gone away常见原因》。
原因
大多数的原因都是连接超时,即8个小时没有和服务器发送交互。
复现错误
php代码
<?php
$db = new \PDO('mysql:host=127.0.0.1;dbname=dbname;charset=utf8','xxxx','xxxx');
$db->exec('set session WAIT_TIMEOUT=2;');
sleep(2);
$db->exec('BEGIN;');
此时会报错
Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away
解决方法
- 修改mysql配置
如果wait_timeout时间过短,把wait_timeout设置为一个较长的时间,例如3天。默认已经是8个小时了,这么做治标不治本。
wait_timeout=259200
- php脚本实现自动重连
<?php
function connect(){
return new \PDO('mysql:host=127.0.0.1;dbname=dbname;charset=utf8','xxx','xxx');
}
$db = connect();
$db->exec('set session WAIT_TIMEOUT=2;');
sleep(2);
$sql = 'BEGIN;';
try {
$db->exec($sql);
}catch (Exception $e){
if($db->errorInfo()['1']==2006){
$db = connect();
$db->exec($sql);
}
}
思考
如果开启事务时,报错怎么办?