必须执行php init,否则无法生成环境配置、导致运行失败、安全风险及权限问题;它从environments/按所选环境复制配置、设目录权限、注入密钥,不安装代码或下载依赖。

Yii2安装后必须执行init,这不是可选项,而是生成环境配置、保障安全与权限的基础动作。跳过或草率处理会导致本地无法运行、生产环境报错、cookie验证失败、目录不可写等典型问题。
init的本质是环境配置映射
init脚本不安装代码,也不下载依赖,它的核心任务是从environments/目录中,按你选定的环境(Development / Production),把对应的一组预置配置文件复制到项目实际路径下,并自动设置关键目录权限和密钥。
- 它读取
environments/index.php,该文件定义了每个环境要复制哪些文件、哪些目录需设为可写、哪些PHP配置项需注入密钥 - 例如选Development时,会复制
environments/dev/backend/config/main-local.php→backend/config/main-local.php - 同时自动生成
cookieValidationKey并写入main-local.php,这是防止CSRF攻击的强制要求
执行init前必须确认的三件事
很多报错其实发生在init之前,不是脚本本身的问题。
-
数据库配置已就绪:确保
common/config/main-local.php中'db'配置块已填写正确(host、dbname、username、password),init不检查数据库连通性,但后续迁移或访问会立刻失败 -
runtime和assets目录存在且可写:init会尝试
chmod 0777这些路径,若父目录无写权限(如macOS的/var/www或Windows受保护目录),会静默失败;建议提前手动创建backend/runtime、frontend/runtime等空目录 -
PHP扩展已启用:特别是
openssl(用于HTTPS请求)、mbstring(框架字符串处理)、pdo_mysql(数据库驱动);可用php -m | grep -E "openssl|mbstring|pdo"快速验证
开发与生产环境初始化的区别
同一个项目,init要执行两次:一次本地开发,一次部署上线。两者行为差异明显,不能混用。
-
Development模式:启用调试工具栏(Debug Toolbar)、关闭缓存、生成
index-test.php等测试入口、允许error_reporting(E_ALL);适合本地调试 - Production模式:禁用调试功能、开启配置缓存、关闭错误显示、设置严格错误日志路径;init还会跳过交互提示,全程静默执行(适合CI/CD自动化)
- 切换环境时,init不会删除旧配置,但会覆盖同名文件;若
environments/prod/里缺少某配置(如漏配api/config/main-local.php),该文件将不会被生成——务必检查environments/index.php中各环境的setCookieValidationKey和setWritable数组是否完整
常见init失败场景及应对
终端只显示“init failed”或卡在某一步?大概率是以下情况:
-
“overwrite? [Yes|No|All|Quit]”卡住:说明目标文件已存在且内容不同(比如你手动改过
main-local.php),输入y回车即可;想批量覆盖输a -
“chmod: Operation not permitted”:macOS或Linux下当前用户对目标目录无所有权,改用
sudo ./init(仅限开发机),或先chown -R $USER:staff frontend/runtime -
“Failed to generate cookie validation key”:PHP未启用
openssl扩展,或main-local.php中'cookieValidationKey' => ''被手动清空;检查php.ini中extension=openssl是否启用并重启PHP服务











