《基于 swoole 扩展实现真正的 PHP 数据库连接池》读后感

先贴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,去判断一下连接是否还可用,不可用的话就重新建立一个新的链接。
希望能对看到的人有些帮助。

本文章首发在 Laravel China 社区