内容目录 
提醒:本文最后更新于 2021-09-24 19:18,文中所关联的信息可能已发生改变,请知悉!
 在 yii2 的 console 执行的 swoole php 脚本,该脚本一直在后台执行.
 执行一晚上后发现其他客户端无法连接 tcp 服务 发现输出此报错信息 
SQLSTATE[HY000]: General error: 2006 MySQL server has gone away
The SQL being executed was:首先,我们来看一下 yii2 中 open 方法的实现:
/**
     * Establishes a DB connection.
     * It does nothing if a DB connection has already been established.
     * @throws Exception if connection fails
     */    public function open()
    {if ($this->pdo !== null) {return;}他这里只判断 pdo 属性是否不等于 null, 此操作无法判断连接是否已被主动关闭
操作方案
进程启动记录 db 连接时间
tcp 服务接收一条数据时 先判断连接时间是否超出 1 分钟 超出断开
使用 \Yii::$app->db->close() 来关闭数据库连接。
然后下面的 mysql 操作他会自动打开连接
至此解决问题
代码如下
        $server->on('workerstart', function ($server, $fd) {//>> 记录连接数据库时间
            $server->connect_db_time = time();});
    function onReceive($serv, $fd, $tid, $data)
    {
        // 判断运行时间是否超过 1 分钟
        if($serv->connect_db_time < time() - 60){$this->log('Close Db');
            $serv->connect_db_time = time();
// 记录新的连接时间
            \Yii::$app->getDb()->close();
// 关闭数据库连接
            FuncHelper::getRedis()->close();
// 此处关闭 redis 连接}
     }注:mysql wait_timeout 通常默认值为 28800 8 小时断开 修改 wait_timeout 长时间通常不建议
正文完
  
 
 
 