《基于 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 协议》,转载必须注明作者和本文链接
推荐文章: