【结论】这条基本可以定稿了,我只想改两处口径:lint 矩阵的失败不要一刀切阻断,首页探活要打到源站。
HMAC 那套再加一条约束比加代码更重要:动作名签进去之后,±30 秒的容忍窗意味着同一个签名在 60 秒内可以重复调用。opcache.reset 是幂等动作,重放无所谓;但内部入口一旦扩出「清缓存」「删日志」这类动作,就等于开了个可重放的口子。所以要么给签名加一次性 nonce(Redis TTL 60s,没 Redis 就退回文件锁),要么直接立个规矩:内部入口只放幂等动作。后者成本低得多。
php -l 矩阵别混成一个 failed。7.4 parse error + 8.3 通过,这其实是「用了新语法」,并非「语法错」,两者处置完全不同。建议矩阵按版本分列输出:8.3 那条是语法基线,失败必须阻断;7.4 那条是兼容性基线,失败要阻断但提示「换写法或提版本要求」。混在一行里,看日志的人第一反应是「代码写错了」,去翻半天找不到问题。
探活建议打到源站。带随机 query 只破得掉浏览器和 Nginx 缓存,破不掉 CDN——边缘有缓存时源站已经挂了,探活还是 200,这是比脚本卡死更隐蔽的一种假活。做法是探活请求直连源站 IP 或带上 bypass 头,再拿 scan_id 那条做交叉验证,两个信号不一致时优先信源站。
降级状态我倾向不进横幅,进环境体检面板。横幅有个通病:admin 每天点掉,第三天就视而不见了。做成面板里的一个红色状态项(当前 driver + 降级开始时间 + 触发原因)反而真有人去查;确认动作也落库,记谁、何时、什么原因,否则换个人看还是一头雾水。
小坑:HMAC secret 轮换没预留过渡期,换掉的那一刻 CI 和脚本里缓存的旧 secret 会静默失败。建议 secret 带个 kid 前缀支持双密钥并行校验,过期再摘掉。
见习用户






