swoole 的 task 进程是内建支持、开箱即用的异步任务载体,自定义进程无法触发 onfinish 回调、缺乏负载均衡与超时保护、需手动处理通信与错误恢复,仅适用于完全解耦的长期驻留服务。

自定义进程不能直接参与 Swoole 的任务调度和回调机制,Task 进程是内建支持、开箱即用的异步任务载体;想绕过 task 用自定义进程实现类似功能,得自己搭通信、管生命周期、写错误重试,不值得。
自定义进程无法触发 onFinish 回调
Task 进程由 Swoole 内核统一管理,投递后自动走 onTask → 执行 → finish() → onFinish 流程。自定义进程完全游离于这套机制之外:
-
$server->addProcess()添加的进程,onFinish根本不会被调用,哪怕你手动发消息回去 - Worker 进程里没有内置方式监听自定义进程的“完成”,必须自己用
UnixSocket、msgqueue或 Redis 做通知 - 一旦自定义进程崩溃或未响应,Worker 无法感知,容易卡死或漏处理
task() 是原子操作,addProcess() 不是
task() 调用后立即返回,底层自动做序列化、负载均衡(默认轮询)、超时控制、失败重试(可配);而自定义进程需要你手动协调:
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 没有内置负载策略:你得自己维护进程 ID 列表、判断忙闲、决定投给谁
- 没有超时保护:
taskwait()支持毫秒级超时,自定义进程若 hang 住,只能靠pcntl_signal或外部 watchdog 杀掉 - 没有失败兜底:Task 进程挂了会自动重启(受
task_max_request和 manager 管理),自定义进程崩了就得自己pcntl_fork补上
共享数据方式完全不同
Task 进程与 Worker 进程之间,天然通过 $data 参数传递序列化内容,安全隔离;自定义进程则面临更底层的约束:
- 无法直接访问
swoole_table或static变量(跨进程内存不共享) - 想传大对象?得自己
json_encode+socket_write,出错概率高 - 如果要用
shmop或sysvshm,需手动加锁、清理,PHP 层极易内存泄漏 - Redis / MySQL 虽可用,但引入额外 IO 和网络跳转,反而抵消了“本地进程”的性能优势
真正需要自定义进程的场景极少
除非你要跑一个长期驻留、不依赖 Worker 生命周期、且与 Swoole 主循环完全解耦的服务(比如独立的信号监听器、硬件设备轮询器、或嵌入式协议解析 daemon),否则都该优先用 Task:
- 发送邮件、写日志、调第三方 API、批量导入 —— 全部适合
task() - 需要并发控制?用
taskWaitMulti()+ 数组投递,比自己 fork 10 个子进程还稳 - 要动态扩缩容?改
task_worker_numreload 即可,不用动业务逻辑 - 调试困难?
onTask和onFinish日志天然带$task_id和$from_id,链路可追溯
别为了“看起来更自由”去造轮子。Swoole 的 Task 进程不是限制,而是把进程管理、IPC、错误恢复这些脏活全包了——你唯一要写的,就是那个 return 或 finish() 里的业务逻辑。










