thinkphp 8.0 中使用 think\swoole\processpool 实现稳定并发后台任务管理,需 php 8.1+/8.2、swoole 4.8.0+ 扩展,通过继承 processpool 创建 worker 类并配置 worker_num 等参数,支持自动重启、资源隔离与并发控制。

ThinkPHP 8.0 项目中需长期驻留、稳定并发执行后台任务(如 Redis 队列消费、日志归档、定时数据同步),但当前用 nohup php think xxx 启动的进程无法统一管理、自动重启、资源隔离,也无法限制最大并发数——这正是 Process Pool 的核心价值所在。
确认 CLI 环境与依赖就绪
进入项目根目录,执行 php -v,确保输出为 【PHP 8.1 或 8.2】,低于 8.0 将导致 ProcessPool 类不可用;
运行 composer require topthink/think-swoole 安装官方 Swoole 扩展包,该包提供 think\swoole\ProcessPool 抽象类支持;
检查 ext-swoole 是否启用:php -m | grep swoole,若无输出,需先编译安装 Swoole 扩展(4.8.0+ 版本);
注意:Swoole 必须在 CLI 模式下启用,Web 服务器(如 Nginx+PHP-FPM)中的 swoole 扩展状态与此无关。
创建可被 ProcessPool 管理的 Worker 类
在 app/process/ 目录下新建 QueueConsumer.php(目录不存在则手动创建):
命名空间必须为 【app\process】,且类需继承 think\swoole\ProcessPool;
在 WorkerStart 回调中写死 while(true) 循环,否则进程启动即退出——这是最常踩的坑,没有例外;
循环体内必须包含阻塞等待逻辑,推荐使用 Co::sleep(1) 或 Redis::brpop(),禁用 sleep()(会阻塞协程调度);
示例代码关键片段:
protected function onWorkerStart(\Swoole\Process $process): void<br>{<br> $redis = new \Redis();<br> $redis->connect('127.0.0.1', 6379);<br> while (true) {<br> $res = $redis->brpop('queue:task', 5);<br> if ($res) {<br> // 处理任务逻辑<br> }<br> } <br>}
注册并启动进程池
第一步:在 app/command/ 下创建启动指令类,例如 StartPoolCommand.php;
第二步:在 configure() 中设置命令名为 pool:start;
第三步:在 execute() 中实例化 Worker 类并调用 start() 方法;
第四步:进入项目根目录,执行 php think pool:start 启动进程池;
此时终端将保持阻塞状态,【不要按 Ctrl+C 中断】,进程池已转入后台持续运行;
验证是否生效:执行 ps aux | grep QueueConsumer,应看到多个同名进程(数量等于配置的 worker_num)。
配置进程池参数(非默认值必设)
方法一:在 Worker 类构造函数中传入配置数组:
public function __construct()<br>{<br> parent::__construct([<br> 'worker_num' => 4,<br> 'ipc_type' => \Swoole\Constant::IPC_UNIXSOCK,<br> 'enable_coroutine' => true,<br> ]);<br>}
方法二:通过环境变量控制,适用于宝塔或 Docker 场景:WORKER_NUM=6 php think pool:start;
注意:【enable_coroutine => true 时,必须禁用 onMessage 回调】,否则进程启动失败;
ipc_type 推荐设为 SWOOLE_IPC_UNIXSOCK,避免信号冲突;设为 SWOOLE_IPC_NONE 则无法跨进程通信。
停止与重启进程池
直接杀掉主进程即可终止整个池:pkill -f "php think pool:start";
若需优雅退出(等待当前任务完成),在 Worker 的 while 循环内加入信号监听:
Process::signal(SIGTERM, function () { exit(0); });
然后发送终止信号:kill -TERM $(pgrep -f "php think pool:start" | head -1);
重启只需再次执行 php think pool:start,无需清理残留进程——Swoole Manager 进程会自动回收已退出的 Worker。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











