52 lines
2.5 KiB
Markdown
52 lines
2.5 KiB
Markdown
# xxiaw 列表页生产优化记录
|
||
|
||
日期:2026-09-01
|
||
|
||
目标页面:`https://www.xxiaw.com/app_games/index3.html`
|
||
|
||
## 原因
|
||
|
||
1. `gxl_mysql_news()` 的分页分支先执行了一次列表 SQL,随后在普通栏目分支又执行了完全相同的 SQL,导致每次列表页请求重复查询。
|
||
2. 站点的列表数据缓存配置为关闭状态,`index3.html` 每次访问都会进入完整 ThinkPHP 流程并查询数据库。
|
||
3. `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。
|