赞片CMSPHP优化

chinaz
chinaz 初级会员超兽战士
发布于 2026-10-08 00:25 ·1 浏览 ·0 回复

照着这篇做完,你能把赞片CMS的首页首屏时间从 2 秒以上压到 500 毫秒左右,并显著降低服务器 CPU 占用。

赞片CMS 基于 ThinkPHP 框架,程序本身并不重,慢通常慢在三件事上:PHP 每次请求都重新编译文件、模板反复编译、数据库反复查同样的数据。下面按「改一处、见效一处」的顺序来,建议从第一步开始,每做完一步测一次速度,再进下一步。

第一步:打开 OPcache,让 PHP 不再重复编译

这一步做完,PHP 层能省掉大量文件解析开销,通常直接提速 30% 以上。找到 php.ini(用 php --ini 查看路径,宝塔面板在「软件商店 → PHP 7.4 → 配置修改」),在文件末尾加上:

[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0
opcache.save_comments=1

保存后执行 systemctl restart php-fpm(宝塔在 PHP 设置里点「重启」)。用 php -i | grep opcache.enable 确认值是 On。

注意:opcache.validate_timestamps=0 意味着你改了 PHP 文件后必须重启 PHP-FPM 才生效,否则前台永远是旧代码。开发环境请设为 1。

第二步:关掉调试模式,开启模板缓存

这一步注销掉每次请求的调试日志和 trace 输出,并让模板只编译一次。打开站点配置文件,赞片CMS 通常位于 /Application/Common/Conf/config.php(部分版本是 /Conf/config.php),确认这几项:

'APP_DEBUG'          => false,   // 必须 false
'SHOW_PAGE_TRACE'    => false,   // 必须 false
'TMPL_CACHE_ON'      => true,
'TMPL_CACHE_TIME'    => -1,      // -1 表示永不过期
'HTML_CACHE_ON'      => true,    // 开启静态缓存
'HTML_CACHE_TIME'    => 3600,

改完后手动删除 /Application/Runtime/ 和 /data/runtime/ 下的全部内容(保留目录本身),让模板重新编译一次。

注意:APP_DEBUG 开着时,ThinkPHP 每次请求都会写日志文件,日志目录几天就能涨到几个 G,这是很多人服务器变慢的真正原因。

第三步:清掉 runtime 日志的定时任务

这一步给日志目录加个自动清理,防止磁盘写满导致整个站卡死。执行 crontab -e,加入一行:

0 4 * * * find /www/wwwroot/zanpian/Application/Runtime -type f -mtime +2 -delete

路径换成你自己的站点根目录。同时确认 Runtime 目录权限是 755,属主是 PHP 运行用户(一般是 www)。

第四步:数据库加索引 + 开慢查询

这一步把「查得慢」的 SQL 揪出来并加速。先开慢查询日志,编辑 /etc/my.cnf 的 [mysqld] 段:

slow_query_log = 1
long_query_time = 1
slow_query_log_file = /var/log/mysql/slow.log
innodb_buffer_pool_size = 1G

重启 MySQL 后跑一天,用 mysqldumpslow -s t /var/log/mysql/slow.log | head -30 看最慢的语句。赞片CMS 最常见的慢查询是对 zanpian_vod 表按分类 + 状态筛选,加一条组合索引即可:

ALTER TABLE zanpian_vod ADD INDEX idx_type_status (type_id, vod_status);
ALTER TABLE zanpian_vod ADD INDEX idx_addtime (vod_addtime);

innodb_buffer_pool_size 建议设为服务器内存的 50%–70%,前提是这台机器只跑 MySQL + PHP。

注意:加索引前先用 phpMyAdmin 导出一次数据库备份。表数据超过百万行时,ALTER TABLE 建议放到凌晨低峰执行。

第五步:Nginx 开 Gzip 和静态资源缓存

这一步减少传输体积,首屏能再快一截。在 Nginx 站点的 server {} 里加:

gzip on;
gzip_min_length 1k;
gzip_comp_level 5;
gzip_types text/plain text/css application/javascript application/json image/svg+xml;
gzip_vary on;

location ~* \.(jpg|jpeg|png|gif|css|js|woff2)$ {
    expires 30d;
    add_header Cache-Control "public, immutable";
}

改完执行 nginx -t && nginx -s reload。

第六步:把重复查询交给 Redis

这一步让首页的数据查询从「每次查库」变成「先从内存取」。确认服务器已装 Redis,然后在 config.php 里设置:

'DATA_CACHE_TYPE' => 'Redis',
'REDIS_HOST'      => '127.0.0.1',
'REDIS_PORT'      => 6379,
'DATA_CACHE_TIME' => 600,

后台「系统 → 缓存设置」里点一次「清除缓存」,再刷新首页,看 redis-cli info stats 的命中数是否在涨。

注意:如果后台更新了影片但前台十分钟都不变,就是这里的缓存时间在起作用。发布新片后到后台手动清一次缓存。

小结

  • 必做顺序:OPcache → 关调试 → 清日志 → 数据库索引 → Nginx Gzip → Redis。
  • APP_DEBUG 和 SHOW_PAGE_TRACE 上生产环境必须是 false,这一条最容易被忘。
  • opcache.validate_timestamps=0 后,改代码必须重启 PHP-FPM。
  • 慢查询日志是数据库优化的唯一可靠依据,不要凭感觉加索引。
  • 每改一步测一次首页加载时间,才能知道哪一步真正起了作用。
版权声明:本文来自 GJ站长论坛《赞片CMSPHP优化》
原文链接:https://www.gj0.com/thread-642.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。

全部回复 0

还没有回复,来抢沙发~