同一服务器下WordPress插件函数重声明报错排查求助
问题
该WordPress插件已使用多时,同一版本在同一服务器的另一WordPress站点运行正常。请问服务器或PHP的深度优化是否会引发如下PHP致命错误?
[07-Sep-2022 07:41:13 UTC] PHP Fatal error: Cannot redeclare getWooCommerceProductBySku() (previously declared in /home/redacted/wp-content/plugins/duellintegration/includes/duell.php:92) in /home/redacted/wp-content/plugins/duellintegration/includes/duell.php on line 256
代码片段
... 91 if (!function_exists('getWooCommerceOrderDetailById')) { 92 function getWooCommerceOrderDetailById($id, $fields = null, $filter = array()) { ... 255 if (!function_exists('getWooCommerceProductBySku')) { 256 function getWooCommerceProductBySku($sku) { ...
环境信息
- OS: Linux 3.10.0-962.3.2.lve1.5.42.el7.x86_64 #1 SMP Mon Nov 9 08:11:18 EST 2020 x86_64
- PHP二进制路径:
/opt/alt/php74/usr/bin/php - PHP版本: 7.4.30
- 使用的php.ini:
/opt/alt/php74/etc/php.ini - MySQL二进制路径:
/bin/mysql - MySQL版本: mysql Ver 14.14 Distrib 5.7.38, for Linux (x86_64) using EditLine wrapper
- WP-CLI版本: 2.6.0
- Apache版本: 2.4.54
回答
这个错误核心是函数被重复声明,但代码里已经通过if (!function_exists('函数名'))做了存在性判断,按常规逻辑不该出现该问题。服务器或PHP的深度优化确实有可能触发这类问题,常见场景包括:
- OPcache配置异常:若OPcache的
opcache.enable_cli开启,或者缓存的脚本内容出现异常,可能导致同一文件被重复解析,使得函数存在性判断失效。比如OPcache缓存了未加判断逻辑的旧版代码,或是缓存机制冲突导致文件多次加载时跳过了存在性检查。 - 文件包含机制被修改:部分服务器优化会自定义文件包含逻辑,导致
duell.php被重复引入(比如两次调用include/require而非include_once/require_once),即便代码里有判断逻辑,第二次加载时也可能因优化导致判断未执行,或是函数名检查出现偏差。 - 全局作用域或缓存异常:如果服务器优化涉及PHP命名空间强制处理、全局函数缓存机制异常,可能导致
function_exists的判断结果不准确,误以为函数未声明,进而重复定义。
另外,虽然同一服务器的另一站点运行正常,但两个站点的插件加载顺序、主题兼容性、其他插件冲突也可能是诱因,不过服务器优化确实存在触发这类问题的可能性。
内容的提问来源于stack exchange,提问作者bovesan
相关产品推荐
相关产品推荐

