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

本作品采用《CC 协议》,转载必须注明作者和本文链接
每天进步一点点
本帖由系统于 4年前 自动加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 5

@hxy_ali 这个没研究过,还真不知道。
你这第一个问题上次有人推荐过使用supervisor,我平常都是开着错误日志的,经常去看下错误日志。
连接池大小是根据业务来设定的,暂时没看到有什么计算公式,业务量不大的,没必要用连接池。
我这里使用mysqli_ping其实也不是好的做法,因为mysqli_ping也同样是发起了一次请求给数据库的。好点的做法就是直接使用$link,如果使用有问题,没出来数据,报错,可以捕捉错误之后进行重置连接处理,这样就避免了ping操作。

5年前 评论
  1. 那这个server启动后,有监控这些进程的操作吗,比如进程异常挂掉
  2. 连接池的大小设置多少合理啊,有什么计算公式吗
5年前 评论

@wilson_yang
上面的代码的例子 我可以理解为以下图片中的逻辑吗?这个例子只是用到了连接池,减少了长连接的数量,以及频繁创建连接的性能消耗是吗。我想做成异步的,比如在任务投递、连接mysql,查询数据等都是异步的,可以吗

file

5年前 评论

@hxy_ali 对,就是这么个意思。说下你的异步思路看看,我没想过异步需求,swoole 官方文档里面也不推荐异步,我这里也没应用场景。

5年前 评论

我记得看别人说过,mysql维持长连接最长是24小时,如果超过就会自动断开.所以.你应该看看该链接是否超过了24小时,如果超过就毙掉.然后重启一个新的出来.

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!