swoole mysql null_[原]swoole扩展MySQL连接池出现的连接丢失问题

之前一直使用PHP的Swoole扩展,主要用在MySQL数据库连接上,先上服务端代码(最初的参考连接:http://rango.swoole.com/archives/265):

$serv = new swoole_server('127.0.0.1', 3303, SWOOLE_PROCESS, SWOOLE_SOCK_TCP);//端口3303

$serv->set(array(

'worker_num' => 2, //worker线程的数量

'task_worker_num' => 1, //MySQL连接的数量

'daemonize' => true, //守护进程

));

function my_onReceive($serv, $fd, $from_id, $data){

//执行查询

$result = $serv->taskwait($data);

if ($result !== false) {

$serv->send($fd, $result);

return;

} else {

$serv->send($fd, "Error. Task timeout\n");

}

}

function my_onTask($serv, $task_id, $from_id, $sql){

static $link = NULL;

if ($link == NULL) {

$link = mysqli_connect('IP地址', '用户名', '密码', '数据库名称');

//localhost=>UNIX Socket , IP地址=>TCP/IP

}

$result = $link->query($sql);

if ($link->errno == 2006 || $link->errno == 2013){

if (!@$link->ping()){

//挂

$link->close();

$link = mysqli_connect('IP地址', '用户名', '密码', '数据库名称');

$result = $link->query($sql);

}

}

if ($result === false) {

$serv->finish('b:0;');//语句运行失败,这是serialize后的false,下同理

return;

}

if ($result === true){

$serv->finish('b:1;');//写入操作成功

return;

}

$data = $result->fetch_all(MYSQLI_ASSOC);

$serv->finish(serialize($data));

}

function my_onFinish($serv, $data){

}

//设置回调函数

$serv->on('Receive', 'my_onReceive');

$serv->on('Task', 'my_onTask');

$serv->on('Finish', 'my_onFinish');

$serv->start();

在之前使用的时候,隔上一段时间或者长时间没有SQL查询,连接总会断掉并且无法重新链接,导致整体系统就挂掉了.

现在对原连接进行了简单的处理,每次查询完毕会检测错误代码,如果为2006或者2013会进行一次ping操作,检测到连接断掉了,就会关闭连接并且重新连接,重新执行刚才的SQL语句.

这样就可以避免服务中断了…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值