比如插件lecms_spider里面的hook文件model_inc_file.php,代码如下:
APP_PATH.'plugin/lecms_spider/model/spider.func.php',会导致服务器内部错误,问题定位到index.php里面的代码块:
// 兜底:确保已启用插件的 Service 类被加载
// ponytail: model.inc.php 的 model_inc_file hook 注入可能因 tmp 缓存陈旧而丢失
// (tmp/model.inc.php 未重新编译,但 tmp/model_xxx.func.php 重新编译注入了 Service 调用),
// 两者不一致会导致 Class not found fatal 崩溃,触发插件自动禁用机制。
// 此处用 class_exists 守卫兜底,已加载的类不会重复 include;插件 model/ 目录文件均为纯类定义(无 hook 占位符),直接 include 安全
$_plugin_paths_fallback = plugin_paths_enabled();
foreach ($_plugin_paths_fallback as $_path_fb => $_pconf_fb) {
$_model_dir_fb = $_path_fb . '/model';
if (!is_dir($_model_dir_fb)) continue;
foreach (glob($_model_dir_fb . '/*.php') as $_service_file_fb) {
$_class_name_fb = ucfirst(basename($_service_file_fb, '.php'));
if (!class_exists($_class_name_fb, false)) {
include_once $_service_file_fb;
}
}
}这里也会自动引入spider.func.php,导致重复引入,提示里面的函数重复定义!
解决方案:
1、插件开发不需要使用model_inc_file.php引入model文件夹下面的文件?这个是否合理?还是xiunox的插件开发和xiunobbs的插件开发差异,不能按xiunobbs的方式开发。
2、更新程序index.php里面的代码,过滤 *.func.php的自动引入
// 兜底:确保已启用插件的 Service 类被加载
// ponytail: model.inc.php 的 model_inc_file hook 注入可能因 tmp 缓存陈旧而丢失
// (tmp/model.inc.php 未重新编译,但 tmp/model_xxx.func.php 重新编译注入了 Service 调用),
// 两者不一致会导致 Class not found fatal 崩溃,触发插件自动禁用机制。
// 此处用 class_exists 守卫兜底,已加载的类不会重复 include;插件 model/ 目录文件均为纯类定义(无 hook 占位符),直接 include 安全
$_plugin_paths_fallback = plugin_paths_enabled();
foreach ($_plugin_paths_fallback as $_path_fb => $_pconf_fb) {
$_model_dir_fb = $_path_fb . '/model';
if (!is_dir($_model_dir_fb)) continue;
foreach (glob($_model_dir_fb . '/*.php') as $_service_file_fb) {
if (substr(basename($_service_file_fb), -9) === '.func.php') continue;
$_class_name_fb = ucfirst(basename($_service_file_fb, '.php'));
if (!class_exists($_class_name_fb, false)) {
include_once $_service_file_fb;
}
}
} Bug反馈
- 程序版本:
- 1.1.6
- PHP版本:
- php8.5
- MySql:
- 5.7
- 复现步骤:
- 服务器错误,插件里面model文件夹下的 *.func.php重复引入
- 预期结果:
