先貼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 協議》,轉載必須註明作者和本文連結