Swoole(七)异步TCP服务器

Swoole提供了异步任务处理的功能,可以投递一个异步任务到TaskWorker进程池中执行,不影响当前请求的处理速度。


在Server程序中如果需要执行很耗时的操作,比如一个聊天服务器发送广播,Web服务器中发送邮件。如果直接去执行这些函数就会阻塞当前进程,导致服务器响应变慢。


1.代码讲解

1.创建TCP服务器:$serv = new swoole_server(“0.0.0.0”, 9501);
2.设置异步任务的工作进程数

1
$serv->set(array('task_worker_num' => 4));

3.onReceive事件,用来投递异步任务,同时获取此次异步任务的ID
1
2
3
4
5
//投递异步任务
$serv->on('receive', function($serv, $fd, $from_id, $data) {
//获取此次异步任务的ID
$task_id = $serv->task($data);
});

4.onTask事件,用来处理异步任务,同时返回任务执行的结果
1
2
3
4
$serv->on('task', function ($serv, $task_id, $from_id, $data) {
//返回任务执行的结果
$serv->finish("$data -> OK");
});

5.onFinish事件,用来处理异步任务的结果
1
2
3
4
//处理异步任务的结果
$serv->on('finish', function ($serv, $task_id, $data) {

});

6.启动服务器,$serv->start();


2.代码运行

上传脚本代码至服务器并运行,再开启一个终端可以看到已经有4个额外的worker进程在运行

我们把这个终端当作TCP客户端采用TCP方式连接服务器测试,并发送消息

此时在另一个终端即TCP服务器端可以看到如下