swoole task机制通过独立taskworker进程异步执行耗时任务,避免阻塞worker进程;需配置task_worker_num>0、注册ontask与onfinish回调,用task()投递、return/finish返回结果,确保高并发下非阻塞响应。

你需要让PHP服务在不阻塞用户请求的前提下,完成邮件发送、数据统计或图片处理这类耗时操作,Swoole的Task机制正是为此设计的独立任务执行通道。
启用TaskWorker进程池
在Server启动前必须显式配置task_worker_num,否则调用task()会直接失败并抛出致命错误。【task_worker_num必须大于0】
修改swoole_server的set()配置,添加'task_worker_num' => 4(数值根据任务吞吐量预估,初期可设为worker_num的1/2~2倍)。
仅配置数量还不够——必须注册onTask和onFinish两个回调函数,缺一不可,否则任务投递后无处执行也无人接收结果。
从Worker进程投递任务
在onReceive/onMessage/onRequest等worker事件中,调用$server->task($data)即可发起异步投递。
这一步操作起来很简单,直接把要处理的数据(数组、字符串、JSON字符串均可)传进去就行;但注意:单次投递数据若超过8KB,Swoole会自动写入临时文件中转,带来额外IO开销,所以建议提前序列化并控制体积。
task()是完全非阻塞的,调用后立刻返回task_id,worker进程马上继续执行后续逻辑,比如立即给客户端返回“已提交”,绝不等待task完成。
在Task进程中处理任务
所有投递来的任务都会进入onTask回调,签名是function($server, $task_id, $src_worker_id, $data)。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
这里就是真正的耗时操作发生地:连接MySQL执行批量更新、调用PHPMailer发100封邮件、用imagick缩放50张图片——这些都可以放心写,不会卡住任何客户端连接。
处理完毕后,必须用return语句或$server->finish($result)将结果返回;若既不return也不finish,该task_id将永远挂起,且对应TaskWorker进程会被永久占用无法复用。
接收Task执行结果
当Task进程完成并返回结果,worker进程会在onFinish回调中收到通知,签名是function($server, $task_id, $data)。
此时可做最终响应:查数据库确认状态、推送WebSocket消息给用户、记录日志到ELK——所有这些都发生在原始请求已返回之后,纯粹是后台补全动作。
注意:$task_id是全局唯一整数,可用于关联原始请求上下文,比如在投递前把$fd或订单号存进$data里,此处再提取出来做精准推送。
常见问题排查路径
方法一:任务没触发onTask?先检查task_worker_num是否为0或未设置,再确认onTask回调是否已绑定。
方法二:onFinish收不到结果?查看onTask中是否遗漏return或finish调用,同时确认task进程未因致命错误崩溃(可通过log_file配合tail -f实时观察)。
方法三:大量任务堆积、worker开始阻塞?说明task_worker_num过小或单个task耗时过长,需按公式「所需task进程数 ≥ 每秒任务数 ÷ 单task平均耗时(秒)」重新估算并扩容。










