2.5 KiB
2.5 KiB
xxiaw 列表页生产优化记录
日期:2026-09-01
目标页面:https://www.xxiaw.com/app_games/index3.html
原因
gxl_mysql_news()的分页分支先执行了一次列表 SQL,随后在普通栏目分支又执行了完全相同的 SQL,导致每次列表页请求重复查询。- 站点的列表数据缓存配置为关闭状态,
index3.html每次访问都会进入完整 ThinkPHP 流程并查询数据库。 gxl_news已有联合索引newslist(news_status, news_cid, news_addtime),能够覆盖当前栏目的筛选和排序,因此没有新增重复索引。
线上改动
/www/wwwroot/www.xxiaw.com/Lib/Common/Common/con_common.php- 删除分页分支中第一次、无条件执行的重复列表查询。
/www/wwwroot/www.xxiaw.com/Lib/XxiawListPageCache.php- 新增仅作用于无参数
GET /app_games/indexN.html的页面缓存。 - 新鲜缓存 60 秒,允许 300 秒旧缓存作为并发回退。
- 使用每页文件锁和原子写入,避免高并发重复生成及半文件。
- 新增仅作用于无参数
/www/wwwroot/www.xxiaw.com/index.php- 在 ThinkPHP 启动前加载列表页缓存。
缓存不会作用于带参数请求、POST/HEAD 请求、后台接口或其他栏目。
备份与回滚
部署前原文件备份:
/www/backup/xxiaw-list-opt-20260901
修正内部重写识别前的中间版本备份:
/www/backup/xxiaw-list-opt-20260901-144651
验证结果
- PHP 5.6 对 4 个相关文件的语法检查全部通过。
- 7 项缓存范围测试全部通过。
- 首次生成请求:HTTP 200、
MISS、源站本机总耗时 29.506 ms。 - 随后 12 次缓存请求:全部 HTTP 200、
HIT。 - 缓存命中总耗时中位数 0.962 ms,范围 0.763–1.262 ms。
- 优化前后页面标题一致,主列表 20 条链接及标题逐条一致。
- 带参数的同一页面和其他栏目均无缓存标记,确认未越界。
- MySQL 验证快照:
Threads_running=1、Threads_connected=3。
仍存在的整机压力
检查期间服务器一度有约 2,876 条已建立 TCP 连接、4,015 条 orphan TCP,系统负载约 5.4;多个来源 IP 同时保持上百条到 80/443 端口的连接。公网响应仍可能因连接洪峰出现明显波动,这部分已经与本列表页 PHP/SQL 执行分离。
宝塔进程只做了单独重启,未重启 Nginx、PHP、MySQL 或服务器。宝塔端口 8686 正常监听;其入口启用了 User-Agent 校验,无浏览器标识的请求会返回 404,标准 Chrome 浏览器标识访问返回 HTTP 200。