已优化 关于插件开发,model文件夹下的文件重复引入导致500错误的问题反馈 [复制链接]

二级用户组

比如插件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重复引入
预期结果:
管理员标记为「已优化」,奖励 +5 积分
最新回复
  • 贰先生 社区元老金冠神 管理员组 置顶

    XIUNOX 规范:插件 model/ 目录只放 Service 类(类名=文件名),由系统自动加载,不需要写 hook/model_inc_file.php。

    lecms_spider 用的是 xiuno 原版写法(spider.func.php 函数库 + hook 注入),与 XIUNOX 的自动扫描机制冲突,导致函数重复定义 fatal。

    已优化:XIUNOX 已更新兜底逻辑,过滤 *.func.php,避免与 hook 注入冲突。但 XIUNOX 不保证兼容 xiuno 原版 func.php 写法。

    适配方案(二选一):

    1. 推荐:把 spider.func.php 里的全局函数改成 SpiderService 静态类方法,删除 hook/model_inc_file.php,符合 XIUNOX 规范

    2. 临时:把 spider.func.php 移到插件根目录(不在 model/ 下),保留 hook 注入

    1月前
  • 老张爱折腾 一级用户组
    我之前也踩过类似的坑,hook 里用 include 引 model 文件,插件重新启用或者缓存没刷干净的时候类重复定义直接 500,后来统一改成 require_once 就好了。楼主这个报错是每次稳定复现,还是开关插件之后才出现?如果只出现在开关之后,大概率是 tmp 缓存新旧不一致,清一下缓存再试。
    1月前
    Lecms 二级用户组 作者 回复@老张爱折腾:
    时不时的出现,不是一直出现~
    1月前
  • xiunox 一级用户组

    建议采纳你的过滤方案,同时补充一点:.func.php 是函数库而非类定义,class_exists 守卫对它无效,因此必须跳过。根因是 index.php 的兜底逻辑假设 model/ 下全是纯类文件,与 XiunoBBS 的 model_inc_file 钩子加载方式冲突。

    插件作者侧也需注意:若用 model_inc_file 引入函数文件,建议改用 include_once 或加 function_exists 判断,避免重定义;而框架侧过滤 *.func.php 是低成本且安全的修复,能兼容旧插件。另外临时缓存陈旧导致的不一致,可通过禁用插件后清 tmp 再启用规避,但长期仍需框架层面解决,期待官方补丁。【 AI 自动回复,仅供参考】

    1月前

请先登录后再回复 登录

uid:23 二级用户组
关注
发帖 14
评论 13
粉丝 2
关注 0
发新帖
目录
关于插件开发,model文件夹下的文件重复引入导致500错误的问题反馈
本站服务器由 酷鸭 赞助
TraeWork AI 办公平台
WorkBuddy 是智能 AI 工作台
广告招租
广告招租
广告招租
广告招租
广告招租