PHP套接字服务器中的数据库连接
我正在运行一个Yi2控制台应用程序,它启动一个websocket聊天服务。这一切都很正常,正如人们所认为的那样,但经过一段时间的不活动之后,我得到了SQLSTATE[HY000]:一般错误:2006年MySQL服务器已经消失了。我试图增加超时,将用户abort设置为false,并在PDO的构造函数中设置PDO::ATTR_PERSISTENT=>true,但这仍然在发生PHP套接字服务器中的数据库连接,php,database,sockets,yii2,long-running-processes,Php,Database,Sockets,Yii2,Long Running Processes,我正在运行一个Yi2控制台应用程序,它启动一个websocket聊天服务。这一切都很正常,正如人们所认为的那样,但经过一段时间的不活动之后,我得到了SQLSTATE[HY000]:一般错误:2006年MySQL服务器已经消失了。我试图增加超时,将用户abort设置为false,并在PDO的构造函数中设置PDO::ATTR_PERSISTENT=>true,但这仍然在发生 是否有办法检查数据库连接是否仍处于活动状态,或者如何重新连接到数据库。可以使用纯php,也可以使用Yi2框架更好。不确定您应该
是否有办法检查数据库连接是否仍处于活动状态,或者如何重新连接到数据库。可以使用纯php,也可以使用Yi2框架更好。不确定您应该在何处使用此代码,但是可以使用相关代码来检查连接是否处于活动状态,可以使用类中的以下方法 getIsActive:返回一个值,该值指示数据库连接 已建立 要重新连接,您可以使用 打开:建立数据库连接。如果一个DB 已建立连接
我遇到了一个类似的问题,并通过为DB connection创建自己的类来解决它,这确保了连接在实际查询之前处于活动状态
class DbConnection extends \yii\db\Connection {
private $stamp;
/**
* {@inheritdoc}
*/
public function createCommand($sql = null, $params = []) {
try {
// send ping on every 10 seconds
if ($this->stamp < time()) {
$this->stamp = time() + 10;
parent::createCommand('SELECT 1')->execute();
}
} catch (\yii\db\Exception $e) {
// if ping fail, reconnect
$this->close();
$this->open();
}
return parent::createCommand($query);
}
}
在创建命令之前,它每10秒发送一次ping查询。如果ping失败,连接被中断,它将尝试重新连接
这不会阻止断开连接,但如果连接中断,它将自动重新连接。如果您正在使用事务,这可能是棘手的。如果连接在事务中间被中断,事务将由数据库隐式回滚,上面的代码将隐式重新连接,因此您甚至没有注意到事务在某个点上回滚。
我也没有在主从配置中测试它。但在我的情况下,它工作得非常好,只需与单个服务器建立只读连接,因此,您可以使用它作为基础,并通过额外的事务检查或主/从连接来调整您的需要。您是否尝试将配置中的MYSQL主机设置为127.0.0.1而不是localhost它是一个远程数据库,而不是localhost。我尝试只调用Yii::$app->db->open;因为它有内部检查连接是否存在,但问题似乎是PHP进程假设连接仍然打开,而数据库服务器没有或关闭连接,我找不到任何方法来精确检查。您是否尝试在/cli/PHP.ini中临时添加mysql.connect\u timeout=-1以进行故障排除。还没有,我会试试的,我也在想类似的事情,谢谢分享。我试试看。
class DbConnection extends \yii\db\Connection {
private $stamp;
/**
* {@inheritdoc}
*/
public function createCommand($sql = null, $params = []) {
try {
// send ping on every 10 seconds
if ($this->stamp < time()) {
$this->stamp = time() + 10;
parent::createCommand('SELECT 1')->execute();
}
} catch (\yii\db\Exception $e) {
// if ping fail, reconnect
$this->close();
$this->open();
}
return parent::createCommand($query);
}
}