Yii2.0.47中开启持久化Schema缓存需配置独立的schemaCache组件(如yii\redis\Cache),在db中设enableSchemaCache为true并指定schemaCache为该组件名,结构变更后须主动调用refreshTableSchema()或./yii cache/flush-schema刷新。

Yii2.0.47 中开启并持久化 Schema 缓存,核心是让表结构元数据(字段、主键、外键、索引等)不再每次请求都查 INFORMATION_SCHEMA,而是读取一次后长期存入稳定缓存后端(如 Redis),实现真正意义上的“持久化”复用。
必须配置独立的缓存组件
Schema 缓存不能依赖默认的 cache 组件名称(除非你明确把它设为持久型)。需单独声明一个专用于 schema 的缓存组件,推荐使用 Redis:
- 在
components中添加schemaCache,类为yii\redis\Cache - 确保
redis组件已正确定义(host、port、database、password) - 避免用
FileCache或ArrayCache,它们无法跨进程共享,不满足“持久化”要求
DB 连接中启用并指向该组件
在 db 配置里显式开启,并指定缓存目标:
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=myapp',
'username' => 'root',
'password' => '',
'enableSchemaCache' => true,
'schemaCacheDuration' => 86400, // 24 小时,足够长但非永久
'schemaCache' => 'schemaCache', // 注意:这里指向上面定义的组件名,不是 'cache'
],
关键点:schemaCache 键的值必须与缓存组件的数组键完全一致(如 'schemaCache'),否则会回退到默认 cache 组件甚至静默失效。
上线后结构变更如何安全生效
持久化缓存意味着改表后不会自动更新。必须主动刷新,否则可能报错(如字段不存在、类型不匹配):
- 只刷新某张表:
Yii::$app->db->schema->refreshTableSchema('user') - 刷新全部表结构:
Yii::$app->db->schema->refresh() - 命令行方式(更可控):
./yii cache/flush-schema --component=db
建议在数据库迁移脚本末尾自动调用 refreshTableSchema(),或在部署流程中加入 flush-schema 步骤。
验证是否生效
开启 Yii2 Debug Toolbar 后,观察 SQL 面板:
- 首次访问某张表时,仍会出现
SELECT ... FROM information_schema查询 - 后续请求中该查询消失,说明 Schema 已从缓存加载
- 若始终出现,检查
schemaCache组件是否启动、Redis 是否可连、schemaCache键名是否拼写一致
不复杂但容易忽略。


















