垃圾堆中的精品

垃圾堆中的精品

微擎PHP Cli常驻内存调用数据库超时MySQL server has gone away解决办法

在开发微擎模块使用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,测试完美解决。

评论回复

应监管要求,暂停评论,如有需要联系QQ505097558。

回到顶部