swoole学习之task异步任务

使用场景:

  • 执行耗时操作: 给多人发送邮件, 广播消息等等需要长时间等待的操作

在WebSocket服务中使用

我们需要使用到的函数:

  1. task($data)

    函数投递一个异步任务到task_worker池中。此函数是非阻塞的,执行完毕会立即返回。Worker进程可以继续处理新的请求。使用Task功能,必须先设置 task_worker_num,并且必须设置Server的onTaskonFinish事件回调

    返回值 : 成功返回task_id, 失败返回false

  2. onTask($server,$task_id,$src_worker_id,$data)

    task_idworker_id组合起来才是唯一的,不同的worker进程可能有同样的task_id
    src_worker_id来自于哪个worker进程
    data就是任务的内容,从task函数传递过来的数据

    onTask内的操作完成之后,需要return数据给worker进程, 表示这个任务完成.return的数据会被onFinish$data接收

  3. onFinish($server, $task_id,$data)

    task_id任务id
    data就是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打印消息
swoole学习之task异步任务_第1张图片

你可能感兴趣的:(PHP)