管理命令:异步管理
task 命令管理 easyswoole/task 2.2.1 创建的自定义 Task Worker。它可以查看每个 Task Worker 的运行状态,也可以同时或逐个重载 Task Worker。
task
├── show 查看 Task Worker 状态
└── reload 重载 Task Worker
这里管理的是 EasySwoole Task 组件创建的 Worker,不是执行某一个 Task 业务对象的命令。异步任务的定义和投递方式参见异步任务。
查看 Task Worker
php easyswoole.php task show --mode=produce
每个 Worker 会显示:
| 字段 | 说明 |
|---|---|
index |
Task Worker 编号 |
pid |
当前进程 PID |
State |
accepting 表示接收新任务,draining 表示停止接收并等待现有任务结束 |
Running |
当前正在执行的任务数 |
Success |
已成功完成的任务数 |
Fail |
已失败的任务数 |
processUpTime |
当前 Worker 启动时间 |
没有配置 Task Worker 时会显示 No Task workers available.。
本项目配置 4 个 Task Worker 时的实际输出如下:
Task workers (total: 4)
[0] PID 18863 State accepting
Running 0 Success 0 Fail 0
processUpTime 2026-10-16 00:29:20
[1] PID 18864 State accepting
Running 0 Success 0 Fail 0
processUpTime 2026-10-16 00:29:20
[2] PID 18865 State accepting
Running 0 Success 0 Fail 0
processUpTime 2026-10-16 00:29:20
[3] PID 18866 State accepting
Running 0 Success 0 Fail 0
processUpTime 2026-10-16 00:29:20
持续观察
php easyswoole.php task show --mode=produce --watch=1
--watch 不带值时默认 2 秒刷新一次,也可以指定大于 0 的秒数。按 q、Esc 或 Ctrl+C 退出;非交互终端不能使用。
同时重载全部 Task Worker
php easyswoole.php task reload --mode=produce
默认流程为:
通过 Bridge 查询全部 Task Worker PID
↓
向每个 PID 发送 SIGTERM
↓
组件停止接收新任务并退出
↓
进程管理器创建替代 Worker
命令输出“sent SIGTERM”表示信号已发送,不代表替代 Worker 已经全部就绪。因为所有 Worker 会在同一轮收到信号,Worker 数量较少或任务执行较长时,可能出现短暂没有 Worker 接收任务的窗口。
输出示例:
sent SIGTERM to Task worker PIDs: 18863, 18864, 18865, 18866
滚动重载
生产环境有两个及以上 Task Worker 时,优先使用滚动重载:
php easyswoole.php task reload \
--mode=produce \
--rolling \
--timeout=30
滚动重载每次只处理一个 Worker:
取得初始 Worker 列表并按 index 排序
↓
确认目标 PID 未变化且仍在 accepting
↓
确认还有其他 Worker 可以接收任务
↓
向当前 Worker 发送 SIGTERM
↓
等待旧 PID 消失
↓
等待相同 index 的新 PID 进入 accepting
↓
继续处理下一个 Worker
--timeout 是每个 Worker 的等待上限,默认 30 秒,必须是大于 0 的数字。某个 Worker 超时、PID 被外部替换、没有其他可用 Worker 或发送信号失败时,滚动流程会停止,并保留已经完成的重载结果。
只有一个 Task Worker 时,滚动重载无法提供真正的无空窗切换。高可用异步处理至少应配置两个 Worker,并确保任务投递方能够处理暂时繁忙或连接失败。
滚动重载会等待每个替代 Worker 就绪,因此输出中会同时显示旧、新 PID:
Task Worker 0: PID 18863 -> 19201 ready
Task Worker 1: PID 18864 -> 19202 ready
Task Worker 2: PID 18865 -> 19203 ready
Task Worker 3: PID 18866 -> 19204 ready
若当前没有 Task Worker,则输出:
no Task workers available to reload
强制重载
# 同时向全部 Task Worker 发送 SIGKILL
php easyswoole.php task reload --mode=produce --force
# 逐个使用 SIGKILL
php easyswoole.php task reload \
--mode=produce \
--rolling \
--force=true \
--timeout=10
--force 不带值或设置为 true 时使用 SIGKILL;--force=false 仍使用 SIGTERM。
SIGKILL 不允许 Worker 等待当前任务完成。正在执行的邮件发送、写库或远程调用可能只完成一部分,因此 Task 必须设计为幂等,并通过业务状态、唯一键或重试记录避免重复副作用。日常发布应使用默认的 SIGTERM。
强制重载的输出格式相同,但信号名为 SIGKILL:
sent SIGKILL to Task worker PIDs: 18863, 18864, 18865, 18866
重载前后的检查
# 1. 观察运行任务数量
php easyswoole.php task show --mode=produce --watch=1
# 2. 另一个终端执行滚动重载
php easyswoole.php task reload --mode=produce --rolling --timeout=30
# 3. 再次查看状态
php easyswoole.php task show --mode=produce
确认每个 index 的 PID 已更新、状态为 accepting,并检查 Fail 计数和应用错误日志。Success、Fail 等计数属于当前 Worker 的运行状态,新进程启动后可能重新计数,不能代替持久化业务监控。
源码依据
下一章:Crontab 管理。