通过HTTP来接收数据,SWOOLE来进行异步任务处理的代码示例。用的是HTTP服务,通过Request可以获取提交过来的POST数据。
$serv = new \Swoole\Http\Server('0.0.0.0', 9502);
//设置异步任务的工作进程数量。
$serv->set([
'task_worker_num' => 4
]);
$serv->on('Request', function ($request, $response) use($serv){
// 无效的请求
if ($request->server['path_info'] == '/favicon.ico' || $request->server['request_uri'] == '/favicon.ico') {
$response->end();
return;
}
$data = $request->post;
var_dump($request);
if($data){
$task_id = $serv->task($data);
}
$response->header('Content-Type', 'text/html; charset=utf-8');
$response->end('<h1>Hello Swoole. #' . rand(1000, 9999) . '</h1>');
});
/*此回调函数在worker进程中执行。
$serv->on('Receive', function($serv, $fd, $reactor_id, $data) {
//投递异步任务
$task_id = $serv->task($data);
echo "Dispatch AsyncTask: id={$task_id}\n";
});
*/
//处理异步任务(此回调函数在task进程中执行)。
$serv->on('Task', function ($serv, $task_id, $reactor_id, $data) {
// 延长 5 秒
sleep(5);
echo "New AsyncTask[id={$task_id}]".PHP_EOL;
var_dump($data);
//返回任务执行的结果
$serv->finish(" -> OK");
});
//处理异步任务的结果(此回调函数在worker进程中执行)。
$serv->on('Finish', function ($serv, $task_id, $data) {
var_dump($data);
echo "AsyncTask[{$task_id}] Finish: ".PHP_EOL;
});
$serv->start();