Yii 2.0.54开启Schema缓存需三步:配置cache组件(如FileCache或Redis)、数据库中启用enableSchemaCache并指定schemaCacheDuration和schemaCache、验证缓存落盘;改表后须手动刷新,asArray()查询不走该缓存。

Yii 2.0.54 开启 Schema 缓存能显著减少重复查询 information_schema 的开销,尤其在使用 Active Record 时效果明显。核心不是“加个开关”,而是三步配齐:启用缓存组件、配置数据库连接、确保环境适配。
必须先配好 cache 组件
Schema 缓存依赖一个已注册的缓存组件,默认名是 'cache'。若未配置,即使开启 enableSchemaCache,也会静默退化为无缓存。
- 用文件缓存(开发/小流量适用):
'cache' => ['class' => 'yii\caching\FileCache'] - 用 Redis(推荐线上):
'cache' => ['class' => 'yii\redis\Cache', 'redis' => ['hostname' => 'localhost', 'port' => 6379, 'database' => 0]] - 确保该组件在
config/web.php的'components'下注册,且名称与后续schemaCache值一致
db 配置要写全三个关键项
仅设 enableSchemaCache => true 不够,必须同时指定缓存时长和缓存组件名:
-
'enableSchemaCache' => true—— 显式开启,不能省略 -
'schemaCacheDuration' => 3600—— 单位秒,建议 1 小时起;设为0表示永不过期(慎用) -
'schemaCache' => 'cache'—— 必须与上面 cache 组件的键名完全一致
完整示例片段:
<?phpreturn [
'components' => [
'cache' => ['class' => 'yii\caching\FileCache'],
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=test',
'username' => 'root',
'password' => '',
'enableSchemaCache' => true,
'schemaCacheDuration' => 3600,
'schemaCache' => 'cache',
],
],
];
验证是否真正生效
配完不等于跑通。需手动触发一次表结构读取,并检查缓存是否落盘:
- 在任意控制器里执行:
Yii::$app->db->getSchema()->getTableSchema('user'); - 查 Redis:
keys "schemacache:*"—— 应看到类似schemacache:test:user的键 - 若用 FileCache,检查
runtime/cache/目录下是否有schemacache-开头的文件 - 如果都为空,说明缓存组件未启用或路径权限不足
上线后要注意的两个现实问题
Schema 缓存虽快,但有副作用,必须提前管理:
-
改表结构后必须刷新:执行
ALTER TABLE后,旧缓存会导致字段缺失或类型错误。立刻执行:Yii::$app->db->schema->refreshTableSchema('user');或运行命令:./yii cache/flush-schema -
asArray() 查询不走 Schema 缓存:如果你大量用
User::find()->asArray()->all(),这部分查询不会受益于 Schema 缓存,优化重点应转向数据缓存或查询缓存



















