必须禁用调试模块与日志写入、启用opcache并预热关键类、优化asset发布策略、配置数据库查询缓存、精准控制http缓存头,才能在yii2.0.48中实现真实可测的性能提升。

在 Yii2.0.48 环境中实现真实可测的性能提升,必须绕开默认配置陷阱——比如开启 debug 模块却未关闭日志轮转、启用未压缩的 asset 发布、忽略 PHP OPcache 预热时机,这些都会让 TTFB 延迟翻倍甚至触发 504。
禁用调试模块与日志写入
生产环境必须彻底关闭 yii2-debug 和日志文件写入,否则每个请求会额外触发 3~7 次磁盘 I/O。打开 config/web.php,确认 'bootstrap' 数组中不包含 'debug';同时将 'log' 组件的 targets 全部清空或注释掉。
若项目已部署,检查 runtime/logs/ 目录是否仍在生成新文件——【只要看到 access.log 或 application.log 持续增长,说明日志未真正关闭】。
这一步操作起来很简单,直接删掉 config/web.php 中 'log' => ['targets' => [...]] 整个区块即可。
启用 OPcache 并预热关键类
PHP 8.2+ 默认启用 OPcache,但 Yii2.0.48 的自动加载机制会导致大量类文件首次访问时编译缓存缺失。必须手动预热:
第一步:执行 php -v 确认 PHP 版本 ≥8.2,且 opcache.enable=1(可通过 php -i | grep opcache 验证);
第二步:进入项目根目录,运行 vendor/bin/yii apcu/preload --verbose,该命令会扫描所有 controller、model、component 类并强制加载进 OPcache;
第三步:重启 PHP-FPM 进程(systemctl restart php8.2-fpm),【不重启则预热无效】。
优化 Asset 发布策略
Yii2 默认每次请求都校验 asset 文件哈希值,小版本升级后容易卡在 assetManager->publish() 耗时上。
方法一:强制静态发布
在 config/web.php 的 components 中添加:
'assetManager' => [
'basePath' => '@webroot/assets',
'baseUrl' => '@web/assets',
'forceCopy' => false,
'appendTimestamp' => true,
],
方法二:跳过哈希验证(仅限可信部署环境)
在入口文件 web/index.php 的 Yii::createWebApplication($config) 前插入:
ini_set('yii\web\AssetManager::enableStrictMode', '0');
注意:方法二会绕过 asset 版本校验,上线新 JS/CSS 后需手动清空 web/assets 目录。
数据库连接池与查询缓存
Yii2.0.48 自带 query cache,但默认未启用且依赖 APCu 扩展。先执行 php -m | grep apcu 确认扩展已加载。
在 config/db.php 中追加:
'enableSchemaCache' => true,
'schemaCache' => 'cache',
'queryCache' => 'cache',
'queryCacheDuration' => 3600,
然后在 config/web.php 的 components 中确保 'cache' 使用 apcu:
'cache' => ['class' => 'yiicachingApcuCache'],
这一步做完后,首次执行 ActiveRecord 查询会慢 200ms 左右,后续同条件查询将稳定在 5ms 内。
HTTP 缓存头精准控制
不要依赖 nginx 默认缓存策略,Yii 应用层必须主动设置 Cache-Control。在控制器 action 中加入:
Yii::$app->response->headers->set('Cache-Control', 'public, max-age=3600');
对静态资源(CSS/JS)使用版本化 URL:
echo $this->registerJsFile('@web/js/main.js?v=' . filemtime(Yii::getAlias('@webroot/js/main.js')));
对 API 接口禁用缓存:
Yii::$app->response->headers->set('Cache-Control', 'no-store, no-cache');











