PHP 套接字服务器中的数据库连接



我正在运行一个启动websocket聊天服务的Yii2控制台应用程序。一切都很好,而且应该如此,但是经过一段时间的不活动后,我得到了SQLSTATE[HY000]: General error: 2006 MySQL server has gone away.我试图增加超时,将用户中止设置为 false 并在 PDO 的构造函数中设置PDO::ATTR_PERSISTENT => true,但这仍然在发生。

有没有办法检查数据库连接是否仍然处于活动状态,或者如果没有,如何重新连接到数据库。无论是在纯 php 中还是在更好的 Yii2 框架中。

我遇到了类似的问题,并通过为数据库连接创建自己的类来解决它,这确保了连接在实际查询之前处于活动状态。

class DbConnection extends yiidbConnection {
    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 (yiidbException $e) {
            // if ping fail, reconnect
            $this->close();
            $this->open();
        }
        return parent::createCommand($query);
    }
}

每 10 秒发送一次"ping"查询,然后再创建命令。如果 ping 失败(连接中断(,它会尝试重新连接。

这不会阻止断开连接,但如果连接中断,它会自动重新连接。如果您使用事务,这可能会很棘手 - 如果在事务过程中连接中断,事务将由 DB 隐式回滚,上面的代码将隐式重新连接,因此您甚至不会注意到您的事务在某个时候被回滚。

我也没有在主从配置中对其进行测试。但它在我的情况下运行良好(与单个服务器的只读连接(,因此您可以将其用作基础,并通过对事务或主/从连接进行额外检查来调整您的需求。

不确定此代码的确切位置,但是可以使用相关代码来检查连接是否处于活动状态yiidbConnection类中的以下方法

getIsActive():返回一个值,该值指示数据库是否连接 成立。

要重新连接,您可以使用

open():建立数据库连接。如果数据库不执行任何操作 已建立连接。

if(Yii::$app->db->isActive === FALSE){
     Yii::$app->db->open();
}

相关内容

  • 没有找到相关文章

最新更新