之前看过Rango大神写的http://rango.swoole.com/archives/265,里面提到了mysql连接池,觉得很酷,就直接参(chao)考(xi)了,后来跑了两天经常出现一些不成功的情况,开始怀疑是自己代码有问题,后来终于查到了这里。
function my_onTask($serv, $task_id, $from_id, $sql)
{
static $link = null;
if ($link == null) {
$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));
}
发现$link那里出现了超时不能用的情况,设置了mysql的超时时间变大点也是没用的。于是去查阅了相关的资料,原来是因为mysql的策略是这样的长时间不连接的话,这资源就被mysql服务器释放了,但是我这个地方$link是常驻内存的,还保持着已经失效的资源,正好有几天都没有用户使用的,这个$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));
}
在使用$link的时候,ping一下这个link是否可用,如果不可用了,也重新连一次。
这个效果还不错,至今都没再出过问题了,目前用户量少,这个暂时都够用了。