测试站上写的构造函数属性提升代码跑得好好的,合并上线后整站 500,日志里是 syntax error, unexpected 'public',生产 PHP 还是 7.4。乍看像缓存或者权限的锅,追下去往往不是。

php -v
php -l wp-content/themes/mytheme/functions.php
docker run --rm -v "$PWD":/app -w /app php:7.4-cli php -l index.php

追下去是这么回事:测试站半年前升到了 8.1,生产因为插件兼容一直没动,两边的 PHP 大版本差了一个。代码里用了新语法,测试环境发现不了问题。

「PHP 版本不一致」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。

具体做法是,先对齐两边的 PHP 版本,测试站要么降级要么推动生产升级;发布前用目标版本跑一遍语法检查;持续集成里加一个和目标版本一致的容器跑测试;插件和主题的兼容性在升级前先列清单。

验收就看一点,两边版本号显示同一个大版本,目标版本下语法检查全部通过,上线后不再出现 Parse error。

作者 9823189