《基於 swoole 擴充套件實現真正的 PHP 資料庫連線池》讀後感

wilson_yang發表於2018-03-16

先貼Rango大佬文章的地址:基於 swoole 擴充套件實現真正的 PHP 資料庫連線池
之前公司的專案中用了swoole,正好專案中也有用到MySQL,於是參(chao)考(xi)了一下,因為懶,也沒有去找已經實現的連線池框架,看了這個覺得這裡的實現思路簡單易懂,所以就拿這個直接改了下放到自己的專案裡面,剛上去的時候用起來完全符合預期沒啥問題的。
過了幾天,前端的同事反映說,有時候資料會收不到,於是追了一下原因,發現這裡直接搬運過來的連線池有點問題,看錯誤日誌的表現就是問題出在$link這裡,具體錯誤暫時找不到就不貼了,大意就是Mysql超時不可用了之類的。
看了一下那幾天的業務量,發現基本沒人用了,於是想到可能是因為MySQL伺服器因為長時間無連線到來,就釋放了資源了,然後swoole這個連線池還保持著這個失效的$link,於是對程式碼做了一點小小的改進,如下(原始程式碼可以參考文章來源)

function my_onTask($serv, $task_id, $from_id, $sql)
{
    static $link = null;
    if ($link == null || mysqli_ping($link) == false) {
        $link = mysqli_connect("127.0.0.1", "root", "root", "test");
        if (!$link) {
            $link = null;
            $serv->finish("ER:" . mysqli_error($link));
            return;
        }
    }
    $result = $link->query($sql);
    if (!$result) {
        $serv->finish("ER:" . mysqli_error($link));
        return;
    }
    $data = $result->fetch_all(MYSQLI_ASSOC);
    $serv->finish("OK:" . serialize($data));
}

加多一個判斷條件mysqli_ping($link) == false,去判斷一下連線是否還可用,不可用的話就重新建立一個新的連結。
希望能對看到的人有些幫助。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

每天進步一點點

相關文章