主动断开数据库连接的方法

浏览:2099 发布日期:2021/02/22 分类:技术分享 关键字: 断开 关闭 主动
场景:
job服务消费中会连接mysql,因为数据存放不同数据库中,在进入消费脚本中会重连mysql
而当队列使用queue:work方式时,PHP开启while(true)死循环相同进程跑队列消息。此时因为每次都是用重连,而Db底层会将这些连接存储起来,导致单个进程会进行数十次mysql连接而不断开。
当高并发场景发生,大量消息进来后,mysql会抛出too many connections,超出数据库连接限制。
此时我们想到的是在消费脚本执行的最后,将当前连接进行关闭,那么TP6中有没有关闭的方法呢?
经过翻阅底层代码,发现确实存在数据库的close方法:
1、Connection类底层实现了抽象父类的close方法,在会调用子类PDOConnection做了实现:
vendor\topthink\think-orm\src\db\PDOConnection.php    /**
     * 关闭数据库(或者重新连接)
     * @access public
     * @return $this
     */
    public function close()
    {
        $this->linkID    = null;
        $this->linkWrite = null;
        $this->linkRead  = null;
        $this->links     = [];

        $this->free();

        return $this;
    }
2、但是Connection并没有开放出一个方法可以调用, 不过它的析构函数里面调用了:
vendor\topthink\think-orm\src\db\Connection.php    /**
     * 析构方法
     * @access public
     */
    public function __destruct()
    {
        // 关闭连接
        $this->close();
    }
性质一样, 所以可以这样使用:
Db::__destruct();

因为不想改底层, 加个方法很简单, 但是怕以后升级不好维护
缺点是以后升级怕官方会在析构函数里面加其他逻辑,不过目前只有close方法,所以暂且先用着,等官方出个方法
最佳答案
评论( 相关
后面还有条评论,点击查看>>