在webman中,处理任务,分两种情况
1.不需要得到任务结果的
这种情况,可以用队列去处理,客户端执行扔进队列
操作后,会立即返回,不会阻塞业务进程
2.需要得到任务结果的
这种情况,参考自定义进程处理,如果任务耗时较长,此时会阻塞业务进程
参考过 在workerman中异步任务,但文档中,是在workerman中调用的(worker/onMessage中使用)
尝试在webman/controller/action中
public function task()
{
// 与远程task服务建立异步连接,ip为远程task服务的ip,如果是本机就是127.0.0.1,如果是集群就是lvs的ip
$task_connection = new AsyncTcpConnection('tcp://127.0.0.1:8889');
// 任务及参数数据
$request = [
'class' => 'app\service\User',
'method' => 'get',
'args' => [100], // 100 是 $uid
];
// 发送数据
$task_connection->send(json_encode($request));
// 异步获得结果
$task_connection->onMessage = function($task_connection, $task_result)
{
// 结果
var_dump($task_result);
// 获得结果后记得关闭异步连接
$task_connection->close();
// // 通知对应的websocket客户端任务完成
// $ws_connection->send('task complete');
};
// 执行异步连接
$task_connection->connect();
}
无法得到$task_result
结果,看不到打印的结果
1.如果在一次http请求中,需要执行一个繁重任务,耗时10秒
2.在业务进程中,将此任务扔给任务进程处理
3.需要得到任务处理结果
4.不阻塞业务进程(处理此次http请求的进程)
在webman中,应该如何操作?