Yii项目环境重置需同步处理入口常量、本地配置、缓存目录和数据库状态四者,否则易出现环境错位;入口常量在web/console/index.php中直接define()修改,runtime/和web/assets/必须清空,*-local.php可重命名后用php init重建,必要时重置迁移状态。

Yii 项目环境重置不是“一键回滚”,而是分层清理:入口常量、本地配置、缓存目录、数据库状态,四者必须同步处理,否则会残留 dev 配置却连着 prod 数据库,或 YII_ENV 是 prod 但 debug 仍为 true。
重置 YII_ENV 和 YII_DEBUG 入口常量
这两个常量在 web/index.php(或 console/index.php)顶部定义,是 Yii 运行时的环境基石。修改后不重启 PHP 进程不会生效。
- 直接编辑
web/index.php,找到类似defined('YII_ENV') or define('YII_ENV', 'dev');的行,改成define('YII_ENV', 'prod'); - 同时检查
YII_DEBUG:若存在defined('YII_DEBUG') or define('YII_DEBUG', true);,应改为false - 注意:不要用
or define()形式,避免被其他脚本重复定义报错;直接define()更可控 - CLI 命令(如
php yii migrate)走的是console/index.php,需单独检查并同步修改
清空 runtime/ 和 web/assets/ 目录
这些是 Yii 自动生成的缓存和资源目录,内容与当前环境强绑定。不清理会导致旧 debug 信息、错误路由规则、过期日志继续生效。
-
runtime/下的logs/、cache/、views/全部删除(保留目录结构,只清空内容) -
web/assets/必须清空——它存放压缩合并后的 JS/CSS,若环境从 dev 切到 prod 后没清,页面仍加载未压缩资源,且可能因 asset bundle 生成逻辑不同导致 404 - Linux/macOS:执行
rm -rf runtime/* web/assets/*;Windows 可手动删除或用 PowerShellRemove-Item runtime\* -Recurse -Force - 注意:
runtime/目录本身权限不能删,否则 Web 服务器无法写入新日志
还原本地配置文件(*-local.php)
团队协作中,main-local.php、params-local.php 等文件通常被 .gitignore 排除,是环境差异的核心载体。
- 检查
config/、common/config/、frontend/config/等路径下是否存在*-local.php文件 - 若想彻底重置为初始状态,可临时重命名这些文件(如
main-local.php.bak),再运行php init命令重新生成(选择对应环境) - 若已用
.env方式管理(如知识库中提到的parse_ini_file('.env')),则需确认.env文件内容是否与目标环境一致,并确保该文件未被提交到 Git - 常见坑:
db-local.php中的密码或 host 写死为localhost,切到生产环境后忘记改,导致 DB 连接失败
重置数据库迁移状态(可选但关键)
仅当环境切换涉及 schema 变更(如 dev 有测试表、prod 要干净结构)时才需要。Yii 的迁移记录存在 yii_migration 表中。
- 先备份数据库(重要)
- 执行
php yii migrate/down all回滚所有迁移(慎用,会删数据) - 更安全的做法:导出 prod 环境的 clean schema(不含数据),导入覆盖当前 DB;再运行
php yii migrate重放迁移 - 验证:检查
yii_migration表中version字段是否与migrations/目录下的最新文件名一致
真正麻烦的从来不是改几行代码,而是某次重置后 runtime/cache/ 没清,导致路由缓存还是旧的;或者 console/index.php 忘了同步改 YII_ENV,结果命令行里跑着 dev 却以为自己在 prod —— 这类错位最耗时间排查。


















