Blog
Blog copied to clipboard
2006 mysql server has gone away
2006 mysql server has gone away
场景
php yii 框架,一个 console 任务,执行的时候,报 2006 mysql server has gone away 错误.
方案
导致报错的原因是,这个 console 任务处理的数据太多,大量的错误测试数据发送到 mysql,超出了包大小的限制.
...
$task->status = TaskModel::STATUS_FAIL;
$task->message = json_encode($object->errors);
$task->save();
return self::DELETE;
...
上面的 $task->message = json_encode($object->errors); 文本内容过大,导致 save() 之后,超出了 mysql 限制的大小,
从而导致 2006 mysql server has gone away.
查看 mysql max_allowed_packet 的大小:
azoya_product_system> show variables like '%max_allowed_packet%';
+--------------------------+------------+
| Variable_name | Value |
+--------------------------+------------+
| max_allowed_packet | 16777216 |
| slave_max_allowed_packet | 1073741824 |
+--------------------------+------------+
修改 max_allowed_packet 的大小
azoya_product_system> set global max_allowed_packet = 1073741824;
修改之后,退出 mysql,重新登录即可.
或者,限制 $object->erros 的大小
if (count($object->erros) > 50) {
$object->erros = array_slice($object->erros, 0, 50);
}