namespace Abc\Sync;
function get_orders() { /* ... */ }
// 调用处写 \Abc\Sync\get_orders()

启用新插件后整站白屏,日志第一行是 PHP Fatal error: Cannot redeclare abc_get_orders(),位置指向插件主文件第 38 行。把这个插件停掉立刻恢复访问。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:两个插件声明了同名的全局函数,PHP 加载到第二个就抛致命错误。函数名没有前缀,或者前缀短到容易撞,出问题的概率比想象中高。

「插件函数重声明」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。同一份配置存在多处的,先确认改的是被加载的那一份。

新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

处理上按这个顺序:把插件里的函数收进命名空间 或者加足够长的唯一前缀;存在性判断只能兜底 代替不了改名;改完在测试站同时启用两个插件 确认没有第二个重名。

确认没问题再收工,两个插件同时启用不再白屏,日志里没有 redeclare 相关报错。

作者 9823189