swoole异步任务通过taskworker将耗时操作剥离主请求流,大幅提升响应速度;需配置task_worker_num>0,投递任务使用$server->task(),处理逻辑在ontask中执行并必须调用finish()或return,结果可通过onfinish、轮询或忽略方式获取。

当Web服务需要发送邮件、生成报表或处理图像时,同步执行会让用户等待数秒甚至更久;Swoole异步任务处理把这类耗时操作剥离出主请求流,让Worker进程立即返回响应,TaskWorker后台默默完成工作,整体请求耗时从秒级压缩到毫秒级。
配置TaskWorker进程池
打开服务端启动文件(如server.php),在$server->set([])中添加'task_worker_num' => 4——这个值建议设为CPU核心数的1~2倍,太少会排队,太多则进程调度开销反升。
【task_worker_num必须大于0才启用异步任务机制】
若设为0,$server->task()调用会直接报错,且所有后续任务逻辑被跳过。
投递任务到TaskWorker
在onReceive或onRequest回调里,用$server->task($data)把原始数据传过去。这一步不阻塞,立刻返回一个整型$task_id,可用于日志追踪或客户端反馈。
注意:$data只能是字符串、数字、数组或对象(需满足PHP序列化要求),不能含资源句柄(如file handle、mysqli连接)——否则TaskWorker反序列化失败,整个任务静默丢弃。
编写Task处理逻辑
注册onTask事件回调,它在独立的TaskWorker进程中运行:
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
第一步:接收参数——function ($server, $taskId, $workerId, $data) {
第二步:执行真实业务——比如调用mail()发信、用imagick缩图、或向Redis写入统计结果。
第三步:必须调用$server->finish($result)或return $result——否则该任务永不结束,TaskWorker内存持续累积,最终触发OOM或进程崩溃。
获取异步任务结果
方法一:监听onFinish事件,在Worker进程中接收$server->finish()传回的数据,适合记录日志或更新数据库状态。
方法二:客户端主动轮询或WebSocket推送——TaskWorker处理完后,通过swoole_table或Redis标记任务完成,前端按ID查结果。
方法三:忽略结果——对“发邮件”“写日志”类无强依赖场景,投递即完成,不等finish回调也完全可行。










