在开发微擎模块使用workman时,常驻内存,会导致数据库超时报错MySQL server has gone away,该文章记录最简单便捷的解决方法
在开发微擎模块,运行workman等常驻内存功能时,调用数据库会导致超时(MYSQL默认8小时)。因为功能开发中习惯使用了微擎的数据库pdo_方法,但是查看workman中要调用Workerman/MySQL类。具体方法就是重写:
$socket = new Worker("websocket://0.0.0.0:{$port}",$context);
$socket->transport = 'ssl';
//$socket->count = 4;//启动x个进程对外提供服务
$socket->onWorkerStart = function($worker) {
// 将db实例存储在全局变量中(也可以存储在某类的静态成员中)
global $db;
require '../../../../data/config.php';
$master = $config['db']['master'];
$db = new \Workerman\MySQL\Connection($master['host'],$master['port'],
$master['username'], $master['password'],$master['database']);
};
初始化后,对照官方文档使用方法进行增删改查
$listSql = "SELECT {$field} FROM ".tablename(PDO_NAME."im").$where
." ORDER BY a.create_time DESC LIMIT {$pageStart},{$data['page_index']} ";
$list['list'] = $db->query($listSql);
不过搞起来那不是要重写一遍SQL嘛、这不是我的风格,于是找到微擎的DB类ramework\class\db.class.php
发现里面有重连DB类
public function reConnect($errorInfo,$params) {
if (in_array($errorInfo[1], array(1317, 2013))) {
$this->pdo = null;
$this->connect($this->name);
$method = $params['method'];
unset($params['method']);
return call_user_func_array(array($this, $method), $params);
}
return false;
}
那不就是直接调用就好么?看到翻看代码后发现只有MYSQL为1317,2013才会重连,那就直接在错误代码后增加2006即可。故批量替换下db.class.php【1317,2013】为【1317,2013, 2006】,一共6次。重启Cli,测试完美解决。
评论回复