GemCMS 性能风险修复更新说明
版本说明
本次更新针对项目前期识别出的多项严重性能、安全风险完成专项整改,重点优化缓存机制、统一数据库连接层、解决外部同步接口阻塞问题,完成从 mysqli 旧写法向 PDO 封装 $DB 类的迁移落地,消除中危安全隐患。
一、优化内容详情
1. 缓存机制优化
原有问题common.php 内每次请求都会执行 $CACHE->update(),触发数据库 REPLACE INTO 写入,缓存完全失效,所有前台访问持续产生数据库写压力。
优化改动
删除
common.php中每次请求强制执行的$CACHE->update(),仅保留pre_fetch(),依靠缓存自身失效机制自动重建缓存;在
function.php的saveSetting()配置保存函数中新增缓存刷新逻辑;变更后规则:仅后台修改配置时才更新缓存,普通用户前台访问不再触发缓存写库操作。
收益:大幅降低前台访问带来的数据库写入压力,缓存机制恢复设计预期。
2. 数据库连接统一 & 旧 mysqli 代码重构
原有问题项目同时维护两套数据库连接:PDO 封装 $DB + mysqli $conn;$conn 在后台、定时备份、ajax、api、站点地图等25处位置调用,存在重复数据库连接开销;直接拼接SQL语句,存在SQL注入风险,且mysqli在高版本PHP兼容性较差。前期评估结论为无法直接移除$conn,需要全量迁移改造。
优化改动
删除
common.php中$conn(mysqli)初始化代码,消除双连接并发开销;全量迁移改造:
ajax.php、cron.php、admin/set.php、admin/index.php、api.php、api/fxmb.php、api/sitemap/sitemap.php等文件中所有mysqli_*原生调用,替换为$DBPDO预处理接口;适配差异:针对
mysqli_fetch_array数字索引读取逻辑,适配PDOPDO::FETCH_NUM读取模式,保证备份、数据查询原有业务逻辑不变;配套扩展:在
db.class.php补充getServerInfo()等需要的工具方法,兼容后台查看数据库版本等原有功能。
收益
每个PHP进程仅维持单个数据库连接,数据库连接开销减半;
全部SQL改为参数化预处理查询,消除SQL注入安全风险;
数据库层统一为PDO,消除两套连接代码的维护负担,适配PHP8+环境。
3. 外部同步API阻塞风险加固

原有问题系统多处存在同步curl外部接口调用(授权校验Checkkiha、IP归属地 get_ip_city 查询),curl_get 默认超时30秒,外部接口超时缓慢时,会造成页面请求卡死、服务阻塞。
优化改动
对
gem.class.php的Checkkiha()授权校验增加24小时缓存,避免每次请求都发起远程调用;将全局
curl_get默认超时时间由30s调整为3s;完善异常处理逻辑,外部接口超时失败时不阻塞主页面渲染流程。
收益:规避第三方接口不稳定带来的站点卡死风险,提升站点稳定性。
二、已验证业务范围
✅ 前台访问、点赞统计 ✅ 后台配置保存、MySQL版本信息查看 ✅ 数据库备份 cron 脚本 ✅ API接口、模板渲染、站点地图生成 ✅ IP归属地查询、远程授权校验
三、上线验证建议
数据库连接监控:确认PHP进程仅建立单条数据库连接,不再同时存在mysqli、PDO双连接;
表写入监控:正常前台访问不再产生
gem_cache表写操作,仅配置保存时触发;功能回归:覆盖后台、定时任务、全部API、前端页面流程;
异常场景测试:模拟外部IP查询接口超时,验证页面不会长时间卡住。
四、遗留说明
本次已完成前期识别的全部严重性能风险修复,原代码中标记的部分仅声明 global $conn 但未实际调用的冗余声明,可在后续迭代中选择性清理。
源码地址 https://wwbxp.lanzouc.com/iQKAW4dhwvha










发表评论