优先用composer安装yii2高级版,避免解压+init.bat导致php路径错误、cookievalidationkey缺失、runtime/assets不可写及/web子目录路由失效问题。

直接说结论:XAMPP 上部署 Yii2 高级版,别用解压归档 + init.bat 硬跑,优先走 Composer 安装;否则大概率卡在 php.exe 找不到、cookieValidationKey 报错、runtime 目录不可写、URL 带 /backend/web/ 且路由失效这四类问题上。
为什么不能直接解压高级模板后双击 init.bat?
因为 init.bat 默认调用系统 PATH 中的 php.exe,而 XAMPP 自带的 PHP 很可能没加进系统环境变量——结果就是弹出“'php.exe' 不是内部或外部命令”。即使你手动改了 init.bat 里的 PHP_COMMAND 路径(比如 PHP_COMMAND=C:\xampp\php\php.exe),后续执行 php yii migrate 时仍可能因 vendor/autoload.php 加载失败而报 Class 'Yii' not found。
真正可靠的做法是:先确保 composer 和 XAMPP 的 php.exe 都能被终端识别,再用 Composer 创建项目。步骤如下:
- 确认
C:\xampp\php已加入系统 PATH(右键“此电脑”→属性→高级系统设置→环境变量→系统变量→Path→新建) - 打开 CMD 或 PowerShell,运行
php -v和composer --version,都应正常输出 - 进入
C:\xampp\htdocs,执行:composer create-project --prefer-dist yiisoft/yii2-app-advanced advanced
- 等安装完成,再进
advanced目录运行init(此时用的是 XAMPP 的 PHP,不会路径错乱)
Apache 虚拟主机必须配,否则 /backend/web/ 无法正常路由
直接访问 http://localhost/advanced/backend/web/ 会暴露 config/ 目录,且重写规则(.htaccess)在子目录下常被 Apache 忽略,导致所有请求 404 或跳转到首页。这不是 Yii 配置问题,是 Apache DocumentRoot 权限和重写机制限制。
正确做法是绕过子目录,把入口指向 web/ 子目录本身:
- 编辑
C:\xampp\apache\conf\extra\httpd-vhosts.conf,追加两段虚拟主机配置:
<virtualhost>
ServerName frontend.local
DocumentRoot "C:/xampp/htdocs/advanced/frontend/web"
<directory>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php
</directory></virtualhost><virtualhost>
ServerName backend.local
DocumentRoot "C:/xampp/htdocs/advanced/backend/web"
<directory>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php
</directory></virtualhost>
- 编辑
C:\Windows\System32\drivers\etc\hosts,加两行:127.0.0.1 frontend.local 127.0.0.1 backend.local
- 重启 Apache,用
http://frontend.local和http://backend.local访问,不是/advanced/...
数据库迁移前必须检查三个关键点
执行 php yii migrate 报错“Connection refused”或“Access denied”,通常不是密码错了,而是以下三处之一没对:
-
common/config/main-local.php里'dsn' => 'mysql:host=localhost;dbname=yii2advanced'中的dbname必须是已创建的库名(用 phpMyAdmin 或mysql -u root手动建库) -
'username'和'password'要跟 XAMPP MySQL 实际账号一致(默认是root/ 空密码;若改过,必须同步填这里) - XAMPP 控制面板中 MySQL 必须是
Running状态,且端口未被占用(默认 3306;如被占,需改my.ini并重启 MySQL)
另外,migrate 命令必须在 advanced 根目录下运行(不是 frontend 或 backend 子目录),否则会找不到 console/config/main.php。
runtime 和 assets 目录权限问题最隐蔽
页面空白、白屏、或报 Failed to write file,90% 是 runtime 和 assets 目录不可写。XAMPP 在 Windows 下默认以当前用户身份运行 Apache,但某些新版 Windows(尤其启用了 UAC 或组策略)会阻止子进程写入这些目录。
解决方法不是“右键→属性→安全→全勾上”,而是:
- 确保
advanced/runtime和advanced/frontend/web/assets、advanced/backend/web/assets这三个路径存在(Composer 安装后自动建好runtime,但assets可能为空) - 用管理员权限打开 CMD,执行:
icacls "C:\xampp\htdocs\advanced\runtime" /grant Users:(OI)(CI)F icacls "C:\xampp\htdocs\advanced\frontend\web\assets" /grant Users:(OI)(CI)F icacls "C:\xampp\htdocs\advanced\backend\web\assets" /grant Users:(OI)(CI)F
- 不要删掉
assets目录让 Yii 重建——它会在 runtime 下生成临时 assets,但前端 CSS/JS 路径会错乱
复杂点在于:Windows 文件系统 ACL 和 Apache 用户上下文不一致时,仅靠“属性→安全”界面操作往往无效;必须用 icacls 显式授予 Users 组继承式完全控制权,否则 Yii 的 FileHelper::createDirectory() 就会静默失败。











