Hyperf 3.0 异步队列优雅重启需三步:确认async_queue.php中processes≥1、ConsumerProcess已注册并运行、用SIGUSR1或async-queue:reload触发滚动重启;停机前须SIGTERM等待任务完成并校验Redis队列为空;还需在WorkerStopHandler中显式关闭Redis/AMQP连接防泄漏。

Hyperf 3.0 异步队列在代码更新或服务维护时,必须确保正在执行的任务不被中断、已入队任务不丢失、新代码能立即生效——直接 kill -9 或重启主进程会导致任务静默失败、连接泄漏、消息重复或丢失。
确认异步队列驱动与进程已启用
第一步:检查 config/autoload/async_queue.php 中 default 配置的 'processes' 值是否 ≥ 1。若为 0,ConsumerProcess 根本不会启动,所有投递任务将堆积在 Redis channel 中无法消费。
第二步:运行 php bin/hyperf.php start 后,观察控制台日志是否出现 Process[AsyncQueueConsumer] start;若无此日志,说明进程未注册。需确认 config/autoload/processes.php 是否包含 Hyperf\AsyncQueue\Process\ConsumerProcess::class。
第三步:执行 ps aux | grep 'async-queue',确认至少有一个 PHP 进程在运行。没有进程则后续所有重启操作均无效。
用信号触发优雅重启(推荐主用)
Hyperf 3.0 原生支持 SIGUSR1 信号触发 Consumer 进程滚动重启,Worker 逐个退出→加载新代码→重新拉起,全程不丢任务、不中断消费。
方法一:向 Master 进程发送 SIGUSR1
先获取 Master PID:ps aux | grep 'hyperf.*start' | grep -v grep | awk '{print $2}' | head -n1 → 记下该 PID → 执行 kill -USR1 【PID】。
方法二:通过 hyperf 自带命令间接触发(等效)
执行 php bin/hyperf.php async-queue:reload;该命令内部即向 Master 发送 SIGUSR1,无需手动查 PID,适合部署脚本集成。
【注意】若使用自定义 Consumer 类(如 #[Process(name: "my-queue")]),必须确保其继承 ConsumerProcess 或正确标注 @Process 注解,否则信号无法路由到对应进程。
安全停机:等待当前任务完成再退出
停机前必须阻塞式等待所有正在处理的异步任务结束,否则正在写库、发通知、调第三方接口的任务会被强制终止,造成数据不一致。
第一步:向所有 Consumer 进程发送 SIGTERM
ps aux | grep 'async-queue' | awk '{print $2}' | xargs kill -TERM
第二步:Consumer 进程收到 SIGTERM 后会自动进入“拒绝新任务 + 完成存量任务”状态。此时需主动轮询确认是否空闲:
执行 redis-cli -n 0 llen queue(假设 channel 名为 queue)→ 返回 0 表示无待消费消息;同时检查 consumer 进程是否已退出(ps aux | grep async-queue 应无输出)→ 两者同时满足才代表真正停稳。
第三步:仅当第二步确认完成后,才可执行最终的 php bin/hyperf.php stop 或 systemctl stop hyperf。
避免重启后连接泄漏的实操补丁
Hyperf 3.0 在 Consumer 进程重启时,若 AMQP 或 Redis 连接未显式释放,旧连接句柄可能残留,导致 fd 耗尽或连接数暴增。
在 app/Signal/WorkerStopHandler.php 的 handle() 方法末尾,添加显式关闭逻辑:
if (class_exists(\Hyperf\Redis\Redis::class)) { \Hyperf\Redis\Redis::instance('default')->close(); }
if (class_exists(\Hyperf\Amqp\AMQPConnection::class)) { \Hyperf\Amqp\AMQPConnection::getInstance()->close(); }
这一步必须加,否则高频重启后 Redis 连接数会在几小时内突破 65535 上限,引发 Connection refused 错误。


















