swoole多进程模型是异步编程基础设施,不可用pcntl_fork(),应使用swoole_process或task_worker_num;通信禁用文件/apcu,推荐table/redis,并需捕获task worker异常。

PHP多进程本身不是异步编程,但Swoole的多进程模型是异步编程的基础设施——它不靠“fork一堆进程去等I/O”,而是用主进程+Worker+Task Worker分工协作,让I/O等待不卡主线程。
为什么不能直接用 pcntl_fork() + Swoole
Swoole服务启动后已接管整个进程生命周期,此时再调用 pcntl_fork() 会破坏Reactor事件循环,极大概率导致:
- 子进程无法继承Swoole的事件监听句柄,
epoll或kqueue失效 - 父进程收到
SIGCHLD但Swoole内部未注册处理逻辑,变成僵尸进程 - Worker进程内手动fork可能触发内存共享冲突(尤其用了opcache或静态变量)
正确做法是放弃手写 pcntl_fork(),改用Swoole原生的多进程组件。
swoole_process 适合独立后台任务
当你需要一个与HTTP请求无关、长期运行的子进程(比如日志轮转、心跳上报、第三方API轮询),用 swoole_process 最稳妥:
- 它由Swoole统一管理,不会干扰Worker事件循环
- 支持管道通信(
$process->pipe),父子进程可安全传数据 - 必须在
Swoole\Coroutine\run()外使用,否则协程调度器会拦截exec
示例:启动一个每5秒上报一次系统负载的子进程
$process = new swoole_process(function (swoole_process $worker) {
while (true) {
$load = sys_getloadavg()[0];
$worker->write("LOAD: {$load}\n");
sleep(5);
}
});
$process->start();
// 父进程继续处理HTTP请求,不受影响
task_worker_num 是Web请求场景的首选
用户提交表单后要发邮件、写ES、生成PDF?这些耗时操作绝不能塞进Worker进程阻塞响应。Swoole提供专用的Task Worker进程池:
- 配置
'task_worker_num' => 4后,Swoole自动创建4个独立进程,只处理onTask事件 - Worker中调用
$server->task($data)是非阻塞的,立刻返回 - Task Worker执行完后,通过
onFinish回调把结果推回对应Worker,全程不占用请求线程 - 注意:Task Worker内不能用协程函数(如
Swoole\Coroutine\Http\Client),会报Coroutine is not running
典型用法:
$server->on('request', function ($request, $response) use ($server) {
// 立即响应用户
$response->end('已收到,后台处理中');
// 异步投递任务
$server->task(['email' => 'user@example.com', 'content' => '...']);
});
$server->on('task', function ($server, $task_id, $from_id, $data) {
// 在独立进程中发邮件(用PHPMailer等同步库即可)
send_email($data['email'], $data['content']);
});
$server->on('finish', function ($server, $task_id, $data) {
// 可选:记录任务完成日志
});
混合模型下进程间通信的坑
Swoole多进程不是“各自为政”,但通信方式选错会引发严重问题:
- 不要用
file_put_contents()写共享文件——多个Task Worker并发写同一文件会导致内容错乱 - 避免用
apcu_store()共享数据——APCu是进程局部的,Worker和Task Worker之间不互通 - 推荐方案:用
Swoole\Table(进程间共享内存表)或Redis(网络层隔离,天然支持并发) - 若必须用消息队列,优先选
swoole_channel(仅限同进程内协程间)或Unix Socket(跨进程可靠,但需自己实现协议)
最易被忽略的一点:Task Worker崩溃后默认不会自动重启,需在 onTask 中加 try/catch 并记录错误,否则后续任务全积压。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











