构建日志明确打印补丁 applied,线上报错堆栈却仍指向旧代码。重新清 Magento cache 没变化,因为 PHP 执行的源码与 Magento 数据缓存不是一回事。

先在构建目录验证补丁落到了哪个文件

composer show vendor/package
grep -R "patched marker" vendor/vendor/package -n
composer install -vvv --no-interaction

补丁按旧版本上下文制作时,有的工具会失败退出,也有流水线把失败当成非阻断警告。日志里不能只搜 applied,还要确认没有 skipped、cannot apply 或目标包未安装。

构建成功,运行环境也可能没拿到同一份 vendor

镜像若在 patch 前就复制了 vendor,后续构建目录再正确也没用。进入实际处理请求的容器,核对文件校验值、镜像标签与 release 路径。多节点逐台检查,避免新旧节点同时在负载均衡里。

源码更新后还要考虑 OPcache

如果部署会原地覆盖 PHP 文件,而 OPcache 时间戳验证关闭,PHP-FPM 可能继续执行旧字节码。正确做法通常是原子发布后平滑重载 FPM,不是 flush Magento cache。涉及生成类时,再按构建流程重建 generated 和 DI。

我习惯在补丁中选稳定片段计算校验值,在 CI、镜像和线上容器三个阶段比对。验收既看文件内容,也触发原始错误路径。这样能明确是补丁没打、产物没带、节点没换,还是运行时仍缓存旧字节码。