thinkphp 8.1 中长期运行后台任务必须使用 worker 进程常驻内存,需确保 php 版本为 8.1 或 8.2,启用 pcntl 和 posix 扩展,并安装 think-worker 扩展及配置 worker.php。

ThinkPHP 8.1 中需长期运行的后台任务(如 WebSocket 服务、队列监听、定时数据拉取)不能靠 php think command 启动后即退出的方式维持,必须通过 Worker 进程常驻内存并自动管理生命周期——这要求正确配置 worker 驱动、启动类与运行参数。
确认基础依赖已就绪
进入项目根目录,执行 php -v,确保输出为 【PHP 8.1 或 8.2】;低于该版本将无法加载 think-worker 扩展中的协程兼容逻辑。
运行 php -m | grep -E "pcntl|posix|redis",检查 pcntl 和 posix 扩展是否启用——缺少任一将导致 Worker 无法 fork 子进程,【守护模式(-d)下必然崩溃】。
执行 composer require topthink/think-worker 安装官方 Worker 扩展包,该包提供 think\worker\Server 基类与 php think worker:server 命令支持。
配置 worker.php 配置文件
在 config/ 目录下创建或编辑 worker.php,内容必须包含以下核心键:
<?php return [ 'type' => 'websocket', 'host' => '0.0.0.0', 'port' => 2345, 'count' => 4, 'daemonize' => false, 'worker_class' => app\service\WebSocketService::class ];
注意:worker_class 必须指向一个真实存在的类,且该类必须继承 think\worker\Server;若留空或路径错误,php think worker:server start 将直接报错退出,不提示具体缺失文件。
编写 Worker 启动类
在 app/service/ 下新建 WebSocketService.php:
命名空间必须为 app\service,类名与配置中 worker_class 值严格一致;构造函数内禁止调用耗时阻塞操作(如数据库连接、文件读写),否则会导致所有 Worker 进程启动卡死。
重写 onConnect 和 onMessage 方法即可响应客户端事件,无需手动管理连接生命周期——框架已封装心跳检测与超时断连逻辑。
若需在进程启动时初始化 Redis 实例,应在 onWorkerStart 回调中执行,而非构造函数里;否则多进程下会复用同一连接句柄,引发并发冲突。
启动与调试 Worker 服务
第一步:进入 public/ 目录,执行 php ../think worker:server start ——此命令会自动加载 config/worker.php 并启动对应服务。
第二步:观察终端输出是否含 Workerman start success 字样;若提示 Address already in use,说明端口被占用,需改 config/worker.php 中的 port 值。
第三步:添加 -d 参数切换为守护进程模式:php ../think worker:server start -d;此时进程转入后台,日志默认写入 runtime/log/worker.log。
第四步:使用 ps aux | grep worker 查看进程是否存在;若只看到一条 php 主进程而无子进程,说明 count 配置未生效或 pcntl 扩展未启用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











