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

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

每天进步一点点

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 4
  1. 那这个server启动后,有监控这些进程的操作吗,比如进程异常挂掉
  2. 连接池的大小设置多少合理啊,有什么计算公式吗
5个月前

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

5个月前

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

file

5个月前

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

5个月前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!