基于第一个 TCP 服务器,只需要增加 onTask 和 onFinish 2 个事件回调函数即可。另外需要设置 task 进程数量,可以根据任务的耗时和任务量配置适量的 task 进程
<?php
$serv = new Swoole\Server('0.0.0.0', 9501);
//设置异步任务的工作进程数量
$serv->set([
'task_worker_num' => 4
]);
//监听连接进入事件
$serv->on('Connect', function ($server, $fd) {
echo "Client: 用户{$fd}进入房间.\n";
});
//此回调函数在worker进程中执行
$serv->on('Receive', function($serv, $fd, $reactor_id, $data) {
//投递异步任务
$task_id = $serv->task($data);
echo "任务调度: id={$task_id}\n";
});
//处理异步任务(此回调函数在task进程中执行)
$serv->on('Task', function ($serv, $task_id, $reactor_id, $data) {
echo "任务[id={$task_id}]".PHP_EOL;
// 等待10秒
sleep(10);
//返回任务执行的结果
$serv->finish("{$data} -> OK");
});
//处理异步任务的结果(此回调函数在worker进程中执行)
$serv->on('Finish', function ($serv, $task_id, $data) {
echo "任务[{$task_id}] 完成: {$data}".PHP_EOL;
});
//监听连接关闭事件
$serv->on('Close', function ($server, $fd) {
echo "Client: 用户{$fd}退出房间.\n";
});
$serv->start();
执行效果
连接服务器
效应效果