xiis 插件系统建在 Web 服务器层而不是 CMS 业务层,因此与站点类型无关:CMS 站点、PHP 站点与纯静态站点装了插件都能使用。插件按站点目录物理隔离,采用声明式与程序两种形态,目录规范把站点隔离落实到文件系统层面,加载与卸载全程不需要重启程序。
声明式插件零代码,只用清单文件描述响应,适合健康探针、验证文件与固定跳转这类场景;程序形态插件以子进程方式运行,支持任意语言,具备完整的文件、数据库与网络能力,崩溃由操作系统进程边界隔离。两种形态的清单结构一致,区别在路由的处理方式声明。
两种形态可以共存于同一站点,按路由分别声明;形态选择的原则是看需求是否需要代码逻辑,固定输出用声明式,动态处理用程序形态。
插件存放在站点目录下的插件根目录,以站点编号与插件标识两级组织:站点编号对应站点配置,插件标识必须与清单一致。站点之间的隔离是物理隔离,不同站点可以放置同名插件,互不感知;站点作用域由目录位置决定,不需要在清单里声明。
每个插件目录下可以放置清单文件、程序目录、模板目录、静态资源目录与数据目录。扫描只处理有清单文件的那一层,站点编号目录不合法、缺少清单或标识不一致的目录会被忽略并记录日志。
插件的静态资源通过统一前缀对外提供,按插件标识与相对路径映射到静态资源目录。访问方法支持读取与头部请求,路径穿越被拒绝,单文件有大小上限;该通道支持缓存协商与分段下载,可以承担图片、脚本与视频片段的分发。
静态资源的映射只在该站点目录下存在此插件时生效,站点隔离天然生效;前缀本身被列入内核保留路径,插件路由不得声明以该前缀开头的路径,避免与托管通道冲突。
加载流程为扫描目录、读取清单、执行校验、冲突检测、解析配置、准备运行环境与原子替换路由快照。加载过程中任何一步失败都只影响这一个插件或这一条路由,主程序始终可以正常启动;冲突检测直接查库取原值,避免缓存造成的判定滞后。
插件之间的路由冲突按标识顺序解决:同一站点内两个插件声明了相同的方法与路径时,标识靠前者保留、靠后者被丢弃并记录日志。规则确定且可预测,不依赖扫描顺序,排查冲突时看日志即可定位到对方插件。
目录扫描复用配置文件的五秒热更新节拍:目录新增即加载,目录消失或停用即卸载,清单与程序文件变化即重载并重启插件进程。重活在独立的处理流程中异步执行,不会阻塞配置重载,也不会拖慢其他模块。
插件系统自身不建任何数据库表:清单是配置载体,数据目录是私有可写区,上传与下载中转也在数据目录完成,运行态保存在内存快照中。目录存在即已安装,删掉目录即完成卸载,不需要清理数据库记录。
目录规范把插件生命周期收敛成文件操作,热更新把生效成本降到秒级。这两点共同决定了插件可以像静态文件一样被复制、删除与替换,而不会牵动主程序的稳定性,未装插件时读路径首行判空即返回,对既有性能没有影响。
评论
加载中...