帝国 CMS 网站访问速度慢
学完这篇,你能按“先定位、再缓存、后静态化、最后查数据库”的顺序,把帝国CMS 7.5 网站的 TTFB 从几秒降到几百毫秒,并且知道每一步在后台哪个菜单里操作。
第一步:先量一下慢在哪,别上来就改配置
这一步要确定瓶颈是 PHP、SQL 还是图片,做完你能拿到具体数字,而不是凭感觉优化。浏览器按 F12 打开开发者工具,切到 Network 面板,按 Ctrl+F5 强制刷新首页,看第一条请求的 TTFB(等待服务器响应时间)。如果 TTFB 超过 1 秒,登录服务器执行 top -c,看 MySQL 和 php-fpm 哪个占 CPU 高。再执行 mysql -uroot -p -e "show full processlist;",看有没有卡住很久的 SELECT。装了宝塔面板 8.x 的话,进“数据库 -> 慢查询日志”,打开慢查询开关,阈值设 1 秒。
注意:TTFB 高不等于服务器差,先看是不是某个
[e:loop]一次查了几万行,改配置之前先定位。
第二步:打开帝国CMS自带缓存,关掉实时统计
这一步要把后台里默认关闭的缓存打开,做完能减少大量重复 SQL。进入后台 /e/admin/,点顶部“系统 -> 系统设置 -> 系统参数设置”(7.5 某些小版本叫“基本参数设置”,找带“统计”“缓存”字样的项),把“统计访问量”“记录访问 IP”“实时更新点击数”全部选“关闭”。再到“系统 -> 系统设置 -> 页面缓存设置”,开启“动态页面缓存”,缓存时间填 3600 秒。接着进“系统 -> 系统设置 -> 数据缓存设置”,把栏目缓存、模板缓存勾上。最后点“系统 -> 数据更新 -> 更新缓存”。
注意:开启页面缓存后,会员中心、购物车这类页面不能缓存,要在“页面缓存设置”里把
/e/member/、/e/pay/等目录排除掉,否则用户会看到别人的登录状态。
第三步:能静态就静态,伪静态只做补充
这一步把动态页面变成 HTML,做完文章页由 Nginx 直接返回,不再走 PHP 和 MySQL。在“系统 -> 数据更新 -> 更新所有栏目页”和“更新所有内容页”,先小批量生成。栏目设置里把“生成方式”改成“静态页”。如果不想全静态,进“系统 -> 系统设置 -> 伪静态参数设置”,选“Nginx 伪静态”,把规则复制到 Nginx 配置的 location / { rewrite ... } 里,执行 nginx -t 测试后 systemctl reload nginx。
注意:静态化后改模板必须重新生成,否则页面还是旧样式;几万篇内容一次性生成会卡死,建议按栏目分批,每批 500 篇。
第四步:改模板里的 e:loop,别让它查全表
这一步减少单页 SQL 数量,做完一个列表页可能从几十条查询降到几条。进“模板 -> 模板管理”,找到首页模板和列表模板,把 [e:loop={...}] 加上 limit='0,10',去掉嵌套循环。能用 [e:loop] 的地方不要用 [e:sql] 手写 SQL。如果必须写 SQL,把 select * 改成具体字段,避免 order by rand()。
注意:
order by rand()和select *在大表上极慢,几十万条数据时一条就能拖垮页面。
第五步:数据库和 PHP 层收尾
这一步给表加索引、开 OPcache,做完查询和 PHP 执行都更快。进“系统 -> 数据表管理”,找到 phome_ecms_news、phome_ecms_news_data_1 等表,给 checked、classid、newstime 字段加普通索引;执行 OPTIMIZE TABLE phome_ecms_news; 清理碎片。PHP 7.4/8.0 的 php.ini 里设 opcache.enable=1、opcache.memory_consumption=128,重启 php-fpm。Nginx 开 gzip 和 expires,静态资源缓存 7 天。
注意:加索引前先备份数据库,别在访问高峰期执行
ALTER TABLE,大表会锁写。
小结
- 先用 F12 的 TTFB 和 MySQL 慢查询定位,再动手改。
- 帝国CMS 7.5 后台“系统 -> 系统设置”里开页面缓存、数据缓存,关实时统计。
- 能生成静态页就生成,伪静态作为补充,记得排除会员目录。
- 模板里给
[e:loop]加limit,避免select *和order by rand()。 - 数据库加索引、PHP 开 OPcache、Nginx 开 gzip,三层一起收尾。
原文链接:https://www.gj0.com/thread-952.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。