赞片CMSPHP优化
照着这篇做完,你能把赞片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。- 慢查询日志是数据库优化的唯一可靠依据,不要凭感觉加索引。
- 每改一步测一次首页加载时间,才能知道哪一步真正起了作用。
原文链接:https://www.gj0.com/thread-642.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。