Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP套接字服务器中的数据库连接_Php_Database_Sockets_Yii2_Long Running Processes - Fatal编程技术网

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

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框架更好。不确定您应该

我正在运行一个Yi2控制台应用程序,它启动一个websocket聊天服务。这一切都很正常,正如人们所认为的那样,但经过一段时间的不活动之后,我得到了SQLSTATE[HY000]:一般错误:2006年MySQL服务器已经消失了。我试图增加超时,将用户abort设置为false,并在PDO的构造函数中设置PDO::ATTR_PERSISTENT=>true,但这仍然在发生


是否有办法检查数据库连接是否仍处于活动状态,或者如何重新连接到数据库。可以使用纯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);
    }
}