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方法,所以暂且先用着,等官方出个方法
最佳答案