yii框架在windows上运行失败主因是php版本低于7.2、必要扩展未启用、composer未正确安装项目、虚拟主机未指向/web目录、runtime及assets目录权限不足;需用新版xampp、启用openssl/mbstring/pdo_mysql、通过composer创建项目、配置vhost指向web子目录,并授予iis_iusrs对runtime和assets的完全控制权限。

Yii 框架在 Windows 上能跑,但直接解压就访问 index.php 几乎必然失败——核心问题不是框架本身,而是 PHP 环境、入口路径和权限配置三者没对齐。
确认 XAMPP 的 PHP 版本和扩展是否达标
Yii2 要求 PHP ≥ 7.2(官方已停止维护 PHP 5.x),而旧版 XAMPP(如 5.6.x)自带 PHP 5.6,装完也启动不了 yii 命令或路由。别试图手动升级 XAMPP 内置 PHP,太容易出错。
- 打开 XAMPP Control Panel → Shell → 执行
php -v,看输出版本号 - 若低于 7.2,直接下载新版 XAMPP(例如
xampp-windows-x64-8.2.12-0-VC15-installer.exe) - 检查
php.ini中这三行是否取消注释(去掉分号):extension=openssl、extension=mbstring、extension=pdo_mysql - 改完重启 Apache,再执行
php --ini确认加载的是你刚编辑的php.ini
用 Composer 安装,别手动解压 Basic Template
官网下载的 yii2-app-basic.zip 是静态快照:没有自动 autoload、vendor 依赖固定、后续无法 composer update,上线前大概率报 Class not found 或 Failed to open stream。
- 确保
php.exe已加入系统 PATH(路径类似C:\xampp\php) - 命令行进到
C:\xampp\htdocs,再运行:composer create-project --prefer-dist yiisoft/yii2-app-basic basic - 如果卡在
Installing dependencies,大概率是源慢或被墙,临时切镜像:composer config -g repo.packagist composer https://packagist.phpcomposer.com - 安装完检查
basic/runtime和basic/web/assets目录是否可写(右键 → 属性 → 安全 → 编辑权限)
Apache 虚拟主机必须指向 /web 子目录
直接把整个 basic/ 放进 htdocs,然后访问 http://localhost/basic/web/,会暴露 config/ 目录、URL 带 /web/、Asset 发布失败、重写规则不生效——这不是“能跑”,是“勉强看到首页但马上崩”。
- 编辑
C:\xampp\apache\conf\extra\httpd-vhosts.conf,加一段:
VirtualHost *:80>
ServerName yii2.local
DocumentRoot "C:/xampp/htdocs/basic/web"
<directory>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php
</directory>
- 编辑
C:\Windows\System32\drivers\etc\hosts,加一行:127.0.0.1 yii2.local - 重启 Apache,用
http://yii2.local访问,而不是http://localhost/basic/web
runtime 目录不可写是 90% 的 500 错误根源
哪怕 PHP 版本、扩展、虚拟主机全对,只要 basic/runtime 不可写,就会在日志里反复出现 failed to open stream: Permission denied,页面直接 500。这不是代码问题,是 Windows 权限模型和 Apache 进程用户之间的经典冲突。
- 右键
basic/runtime→ 属性 → 安全 → 编辑 → 添加用户IIS_IUSRS(XAMPP 下实际是 Apache 服务账户)→ 勾选“完全控制” - 同理处理
basic/web/assets(AssetManager 生成资源时要用) - 查看
basic/runtime/logs/app.log,第一行错误往往就是权限拒绝;别只盯着浏览器 500
最常被跳过的其实是 runtime 权限和虚拟主机 DocumentRoot 指向 —— 这两个点不调对,其他所有操作都是在给错误堆叠更多表象。











