使用场景:
- 执行耗时操作: 给多人发送邮件, 广播消息等等需要长时间等待的操作
在WebSocket服务中使用
我们需要使用到的函数:
-
task($data)函数投递一个异步任务到
task_worker池中。此函数是非阻塞的,执行完毕会立即返回。Worker进程可以继续处理新的请求。使用Task功能,必须先设置task_worker_num,并且必须设置Server的onTask和onFinish事件回调返回值 : 成功返回
task_id, 失败返回false -
onTask($server,$task_id,$src_worker_id,$data)task_id和worker_id组合起来才是唯一的,不同的worker进程可能有同样的task_idsrc_worker_id来自于哪个worker进程data就是任务的内容,从task函数传递过来的数据在
onTask内的操作完成之后,需要return数据给worker进程, 表示这个任务完成.return的数据会被onFinish的$data接收 -
onFinish($server, $task_id,$data)task_id任务iddata就是onTaskreturn过来的数据
具体代码:
$server->on('message',function($server,$frame){
$data = [
'task' => 1,
'fd' => $frame->fd
];
$server->task($data);
$server->push($src_worker_id,date("Y-m-d H:i:s",time())." on message push");//向客户端发送时间
});
$server->on('task',function($server,$task_id,$src_worker_id,$data){
print_r($data);
sleep(10);//模拟10秒的延迟
$server->push($data['fd'],date("Y-m-d H:i:s",time())."on task push");//向客户端发送时间
return "task finished";
});
$server->on('finish',function($server,$task_id,$data){
echo $task_id."\n";
echo $data."\n"
});
通过之前的HTTP页面能访问,查看实际效果
在延迟了10秒之后.向客户端发送了消息,客户端在console打印消息