process适合轻量一次性子进程,需手动管理生命周期;processpool为长期多worker场景设计,自动托管进程生命周期,支持优雅重启但不提供连接池语义。

Process 是单个子进程的封装,ProcessPool 是预启固定数量工作进程的管理器——不是“多个 Process 的集合”,而是更高层的进程生命周期控制器。
Process 适合轻量、一次性、需精细控制的子进程
它直接包装 fork(),每个 swoole_process 实例对应一个独立子进程,自带管道($process->pipe)和信号监听能力。你得自己管理启动、通信、回收,适合写日志推送、异步通知、简单定时任务这类短生命周期操作。
- 不能直接用
start()启动后就不管:必须手动调用$process->start(),再用swoole_process::wait()或pcntl_wait()收尸,否则变僵尸进程 - 父子进程间通信靠
$process->write()/$process->read()(管道)或msgqueue_key(系统消息队列),不自动处理序列化 - 没有内置 WorkerStart/WorkerStop 回调,所有逻辑全在构造时传入的匿名函数里写死
- 若想模拟“池”,得自己实现进程复用、空闲超时、动态伸缩——容易写出内存泄漏或 fork 失败
ProcessPool 是为长期运行、多 Worker 场景设计的进程管理器
它底层复用 Swoole Server 的 Manager 进程模型,启动即拉起固定数量 Worker 进程,并统一托管其生命周期。你只关心 WorkerStart 和 WorkerStop 两个回调,其余由框架接管。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 必须指定数量(如
new ProcessPool(4)),不支持动态增减;设错会直接 OOM 或排队阻塞 - 默认不启用协程,要加
$pool->set(['enable_coroutine' => true])才能在 Worker 内用CoRedis等协程客户端 - 只支持三个事件:
WorkerStart、WorkerStop、WorkerError;注册task或connect会报unknown event type[task] - v4.7+ 新增
$pool->detach():当前 Worker 主动退出,Manager 会立即补一个新进程,保持总数不变——适合需要优雅重启或资源重载的场景
task_worker_num 不是 ProcessPool,也跟线程完全无关
这是最容易混淆的一点:task_worker_num 是 swoole_server(如 HttpServer)内置的同步阻塞式任务进程池配置项,和 ProcessPool 是两套独立机制。前者由 Manager 进程统一 fork + wait,后者是独立实例,可脱离 Server 单独运行。
- 误把
task_worker_num当成“线程池”去调大,会导致每个 TaskWorker 占用完整 PHP 环境内存,Fork failed: Cannot allocate memory随之而来 -
ProcessPool没有taskwait(),也不走server->task()流程;它不参与 HTTP 请求生命周期,纯后台常驻 - 想让 Redis 持久连接跑在进程池里?必须在
WorkerStart中 new 一次CoRedis并存为 static 变量,否则每次循环都新建连接
真正关键的分水岭不在 API 表面,而在你是否需要「进程自动拉起/补位」「统一信号处理」「避免手动 wait」——需要,就用 ProcessPool;只需要一个子进程干完就收工,swoole_process 更轻、更可控。别被“Pool”字眼带偏,它不提供连接池语义,也不缓存任何资源。










