之前一直使用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语句.
这样就可以避免服务中断了…