簡體   English   中英

PHP套接字服務器中的數據庫連接

[英]DB Connection in PHP Socket Server

我正在運行啟動Websocket聊天服務的Yii2控制台應用程序。 一切正常,並按預期進行,但是經過一段時間的不活動后,我得到了SQLSTATE[HY000]: General error: 2006 MySQL server has gone away 我試圖增加超時時間,將用戶abort設置為false,並在PDO的構造函數中將PDO::ATTR_PERSISTENT => true設置PDO::ATTR_PERSISTENT => true ,但這仍在發生。

有沒有一種方法可以檢查數據庫連接是否仍然處於活動狀態,或者如果沒有,如何重新連接到數據庫。 使用純PHP或使用Yii2框架更好。

我遇到了類似的問題,並通過為數據庫連接創建自己的類來解決此問題,該類確保在實際查詢之前連接處於活動狀態。

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失敗(連接中斷),它將嘗試重新連接。

這不會阻止斷開連接,但是如果連接中斷,它將自動重新連接。 如果您正在使用事務,這可能會很棘手-如果在事務中間連接中斷,則數據庫將隱式回滾事務,並且上面的代碼將隱式重新連接,因此您甚至都不會注意到事務在某些時候已回滾。點。

另外,我沒有在主從配置中對其進行測試。 但是在我的情況下,它工作得很好(只讀連接到單個服務器),因此您可以將其用作基礎,並通過對事務或主/從連接的附加檢查來調整您的需求。

不知道確切應該在哪里找到此代碼,但是可以使用以下代碼檢查連接是否處於活動狀態: yii\\db\\Connection類中的以下方法

getIsActive() :返回一個值,該值指示是否建立了數據庫連接。

並重新連接,您可以使用

open() :建立數據庫連接。 如果已建立數據庫連接,則不執行任何操作。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM