PHP写了一个websocket服务,mysql连接实例丢失问题怎么解决?

我用ESD框架
他有个mysql插件,插件内获取mysql实例是用连接池的:

    public function mysql($name = "default")
    {
        $db = getContextValue("MysqliDb:$name");
      
        if ($db == null) {
            /** @var MysqlManyPool $mysqlPool */
            $mysqlPool = getDeepContextValueByClassName(MysqlManyPool::class);
            $pool = $mysqlPool->getPool($name);
            if ($pool == null) throw new MysqlException("No MySQL connection pool named {$name} was found");
            return $pool->db();
        } else {
            return $db;
        }
    }

由于程序是常驻内存的,mysql的连接实例也在内存中的,但是因为mysql的连接是会因为超过 wait_timeou 设置而断开的。所以当断开后程序再次使用内存中的msyql实例时。就会报如下错误:

PHP Warning: mysqli::prepare(): MySQL server has gone away in /data/wwwroot/xunim/vendor/esd/mysql-plugin/src/Mysql/Mysqli.php on line 39

请问各位大神,你们有什么好办法解决?

阅读 3.2k
4 个回答

框架应该提供类似 2006,2013 错误时自动重连并重新执行的功能
如果没有提供就只有自己写 try catch 判断并处理,参考:
https://github.com/tsingsun/y...

定时的向数据库执行一条语句

新手上路,请多包涵

报gone away的时候尝试重连

调整timewait的超时时间吧。简单点

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题