\App\Services\AdminQueueWorkerService

Worker 守护服务

职责:把 artisan queue:pause/resume/restart 的缓存信号机制界面化—— worker 每轮循环(Looping 事件)写心跳缓存,Web 端读心跳判定失联; 暂停/恢复/重启直接写 Laravel Worker 官方读取的缓存键, 界面点击即生效,全程无 shell 命令。

缓存键契约(与 Illuminate\Queue\Console\Pause/Resume/RestartCommand 同源): illuminate:queue:paused:{connection}:{queue} 暂停(Worker 按 (connection, queue) 逐队列消费) illuminate:queue:restart 重启(时间戳变化即平滑退出,supervisor 拉起) jobcenter:worker:hb:{pid} 实例心跳(TTL 60s,过期即失联) jobcenter:worker:list 实例注册表(pid → 元数据)

┌────────────────── 分区导航(按此顺序阅读)──────────────────┐ 分区 1 · 心跳与实例 heartbeat / registerInstance / removeInstance 分区 2 · 状态查询 status / paused 分区 3 · 界面控制 pause / resume / restart └────────────────────────────────────────────────────────────┘

Summary

Methods
Properties
Constants
heartbeat()
registerInstance()
removeInstance()
status()
paused()
pause()
resume()
restart()
start()
No public properties found
HEARTBEAT_PREFIX
LIST_KEY
HEARTBEAT_TTL_MIN
No protected methods found
No protected properties found
N/A
heartbeatTtlSeconds()
pauseKeys()
pauseKeyFor()
instanceList()
No private properties found
N/A

Constants

HEARTBEAT_PREFIX

HEARTBEAT_PREFIX = 'jobcenter:worker:hb:'

心跳缓存前缀

LIST_KEY

LIST_KEY = 'jobcenter:worker:list'

实例注册表键

HEARTBEAT_TTL_MIN

HEARTBEAT_TTL_MIN = 60

心跳 TTL 下限(秒):配置未设/设 0 时兜底,防瞬时误判失联

Methods

heartbeat()

heartbeat() : void

心跳(Looping 事件每轮调用——worker 空转按 --sleep 节奏循环,天然秒级节拍)。 写当前进程心跳 + 更新注册表元数据(保留首次注册的 started_at)。 心跳 TTL = 失联阈值(queue.worker_alarm_minutes),与 status() 判定同源。

registerInstance()

registerInstance() : void

实例注册(WorkerStarting 事件)

removeInstance()

removeInstance() : void

实例注销(WorkerStopping 事件:清除心跳与注册表项)

status()

status() : array

worker 运行状态:实例台账 + 失联判定(无任何心跳 = worker 未在运行 → 监控页红灯)。 失联阈值由站点配置 queue.worker_alarm_minutes 驱动(默认 5 分钟)—— 心跳 TTL 与之同源(heartbeatTtlSeconds),阈值内未更新即键过期判失联, 修改配置界面即刻生效(此前硬编码 60s 与配置脱节)。 sync 同步驱动(QUEUE_CONNECTION=sync)投递即同步执行、无 worker 属正常形态——不告警。

Returns

array —

paused()

paused() : bool

是否已暂停(官方缓存键存在即暂停,按 default 队列判定)

Returns

bool —

pause()

pause() : void

暂停队列:worker 停止取新任务(执行中的自然跑完);覆盖注册表全部队列名

resume()

resume() : void

恢复队列

restart()

restart() : void

重启 worker:更新时间戳,worker 每轮循环检查后平滑退出,由 supervisor 自动拉起

start()

start() : string

启动 worker:失联时界面一键拉起(不再依赖外部 supervisor)。

实现:proc_open 启动独立进程——exec/shell_exec/popen 在本机 PHP 均被 disable_functions 禁用,proc_open 是唯一可用通道;按平台分支:

  • Windows:cmd /c start "" /b 使 worker 脱离请求生命周期独立存活;
  • Linux/macOS:nohup ... & 脱离终端后台运行(setsid 语义由 nohup 承担)。 stdout/stderr 重定向到 storage/logs/queue-worker.log(worker 每轮循环写心跳, 启动数秒后界面台账自动转「运行中」)。

幂等:已有在岗实例(心跳未过期)直接提示,防重复点击双启。

Throws

\InvalidArgumentException

同步模式无需 worker / 进程启动失败

Returns

string —

heartbeatTtlSeconds()

heartbeatTtlSeconds() : int

失联阈值(秒):读站点配置 queue.worker_alarm_minutes(默认 5 分钟), 心跳 TTL 与之同源——阈值内未更新心跳即键过期 = 失联。

Returns

int —

pauseKeys()

pauseKeys() : array

暂停缓存键清单(与 QueueManager::pause 同源): illuminate:queue:paused:{连接}:{队列名}——Worker::getPausedQueues 按 (connection, queue) 逐队列消费;覆盖 default 与注册表全部 queue_name,界面「暂停队列」即整站暂停。

Returns

array —

pauseKeyFor()

pauseKeyFor(string  $queue) : string

单队列暂停键

Parameters

string $queue

Returns

string —

instanceList()

instanceList() : array

实例注册表读取(缓存 JSON 数组,损坏回落空表;僵尸项自愈过滤并写回)

Returns

array —