PHP分布式任务框架需JWT+Redis组合认证,因自定义Token无法主动失效、缺乏上下文绑定且无防篡改能力;JWT提供结构化载荷,Redis实现实时吊销,须校验jti黑名单、强制时钟同步并从环境变量加载密钥。

PHP分布式任务框架本身不内置认证,Token校验必须由你手动集成,且不能只靠签名或时间戳——必须结合服务端状态管理。
为什么不能直接用自定义字符串 Token 做任务调度认证
很多团队在 Worker 启动时生成一个固定 task_token 存进配置,然后每次上报心跳或拉取任务时带上它。这种做法看似简单,但存在三个硬伤:
- 无法主动失效:某 Worker 被入侵或下线后,该 Token 仍能持续调用任务接口,除非改全局配置并重启全部节点
- 缺乏上下文绑定:Token 不关联具体 Worker ID、IP 或启动时间,攻击者截获后可在任意机器复用
- 无签名防篡改:如果只是明文拼接
"worker_123|20260827",中间人可轻易构造合法请求
所以,哪怕是最轻量的分布式任务系统(如基于 Redis 的简单队列),也应把 Token 视为「带生命周期的凭证」,而非静态口令。
推荐用 JWT + Redis 黑名单做任务节点双向认证
Worker 注册和任务分发两个环节都需要验证,JWT 提供结构化载荷,Redis 提供实时吊销能力,组合起来刚好补足无状态 Token 的短板。
立即学习“PHP免费学习笔记(深入)”;
关键设计点:
- Worker 首次上线时,向中心调度服务发起
/v1/worker/register请求,携带基础信息(worker_id、ip、version)和临时密钥(如预置的REGISTRATION_KEY) - 调度服务验证通过后,签发 JWT,Payload 中必须包含:
worker_id、iat、exp(建议 24 小时)、scope(固定为"task:worker") - Worker 持有该 Token 向
/v1/task/pull发起请求;服务端用Firebase\JWT\JWT::decode()解析,并额外检查:redis.exists("token:blacklist:{$jti}") === false(jti需在签发时写入) - 当需要强制下线某 Worker(如检测到异常行为),调度服务调用
redis.setex("token:blacklist:{$jti}", 86400, "revoked")即可,无需重启任何节点
示例签发代码片段:
基于官方 GMGN API 的代币分析工具。通过合约地址查询代币在 SOL/BSC/Base 链上的准确市场数据、安全检测、KOL 分析、开发者分析和 AI 智能分析(叙事/筹码/老鼠仓/机器人)。支持自动识别链。
$payload = [
'worker_id' => $workerId,
'ip' => $ip,
'iat' => time(),
'exp' => time() + 86400,
'jti' => bin2hex(random_bytes(16)), // 唯一令牌 ID,用于黑名单
'scope' => 'task:worker'
];
$token = \Firebase\JWT\JWT::encode($payload, $_ENV['JWT_SECRET'], 'HS256');
// 同时存 jti 到 Redis,过期时间略长于 token 自身 exp,防止时钟漂移误判
$redis->setex("token:blacklist:{$payload['jti']}", 90000, 'pending');
HTTP Header 传 Token 还是 Query 参数?
绝对不要用 Query 参数传 task_token。原因很实在:
- Web 服务器日志默认记录完整 URL,Token 会明文落盘,运维查日志就等于泄露凭证
- CDN、网关、反向代理可能缓存带参数的 GET 请求,导致 Token 被意外重放
- 浏览器地址栏可见,Worker 若运行在非隔离环境(如共享宿主机),风险更高
正确方式只有两种:
- Worker 请求任务时,在
AuthorizationHeader 中传Bearer <token>—— 这是 RFC 标准,所有 HTTP 客户端库都原生支持 - 若 Worker 是 PHP CLI 进程且无法控制 Header(如某些旧版 Guzzle),改用
X-Task-Token自定义 Header,服务端统一从getallheaders()或apache_request_headers()读取
注意:$_SERVER['HTTP_AUTHORIZATION'] 在 Nginx + PHP-FPM 环境下常为空,别依赖它直接取值。
最易被忽略的时钟同步与签名密钥管理
分布式环境下,Worker 和调度服务的时间差超过 30 秒,exp 和 iat 校验就会失败。这不是理论问题——Docker 容器、云主机、物理机的系统时钟漂移真实存在。
必须做两件事:
- 所有节点强制启用
chrony或ntpd,指向同一内网 NTP 服务器,禁止使用公网 NTP(延迟不可控) - JWT 密钥
JWT_SECRET必须从环境变量加载,绝不能写死在代码里;生产环境建议用 HashiCorp Vault 或 AWS Secrets Manager 动态注入
另外提醒一句:别为了“省事”在 Worker 端硬编码密钥去自己签发 Token。调度服务才是唯一可信源,Worker 只负责持有和传递。


















