yii2性能不如laravel主因是默认配置未调优,关debug、启schemacache、切redis缓存、开读写分离四步可使qps常见翻倍;需确保debug模块彻底移除、yii_debug显式设false、schemacache指向有效cache组件、redis配置keyprefix隔离环境、enableslaves=true且slaves非空。

debug、启用 schemaCache、切到 Redis 缓存、打开读写分离,这四步做完,QPS 常见翻倍。
ab压测QPS低?先查debug是否真关闭
很多人设了 YII_ENV=prod 就以为 debug 关了,但只要 yii\debug\Module 还在配置里(哪怕注释不全),它仍会初始化并注入大量钩子。实测中,未彻底移除 debug 模块时,单请求多出 8–12ms 的非业务耗时。
- 检查
config/web.php中是否还有'modules' => ['debug' => ...]配置项,上线环境必须删掉或用条件包裹 -
YII_DEBUG环境变量必须显式设为false(不能只靠YII_ENV推导) - 用
php -r "var_dump(YII_DEBUG);"在入口脚本里验证,避免被 .env 或 web 服务器覆盖
schemaCache不生效?多半是cache组件没配对
开启 'enableSchemaCache' => true 却没效果,90% 是因为 cache 组件没指向有效后端。Yii 不报错,只是静默降级为无缓存模式。
- 确认
config/web.php中'components' => ['cache' => [...]]已正确定义,且类名为yii\redis\Cache或yii\caching\ApcuCache -
'schemaCacheDuration'必须显式设置(如3600),否则默认为 0,等于没开 - 表结构变更后,仅清
runtime/cache/文件不够,得执行Yii::$app->cache->flush()
FileCache卡住高并发?Waiting时间飙升就是信号
ab 报告里 Waiting: 14 1610 3741.9 这一列数值异常高,基本可断定是 FileCache 的文件锁竞争。多个 PHP-FPM 进程争抢同一缓存文件的 flock,导致大量线程阻塞。
- Redis 替换方案必须设
'keyPrefix' => 'yii2-prod:',否则开发/测试/生产共用一个 DB 会互相覆盖 - 连接池参数不用调太激进,
'redis' => ['class' => 'yii\redis\Connection', 'hostname' => '127.0.0.1', 'port' => 6379, 'database' => 1]足够应付 200 QPS 以下场景 - 别漏掉
composer require yiisoft/yii2-redis,扩展未安装时yii\redis\Cache类根本不存在
读写分离没触发?db组件配置缺关键开关
写了主从配置,但所有查询还是打到主库,常见原因是没启用 'enableSlaves' => true 或 slave 数组为空。
-
'slaves' => [['dsn' => 'mysql:host=slave1;dbname=test']]必须是非空数组,哪怕只配一台从库 -
'master' => [...]和'slaves' => [...]是平级字段,不是嵌套在'dsn'下 - 只读查询(如
createCommand()->queryAll())才走从库;insert()/update()等写操作强制走主库,这点无法绕过











