Yii应用真正启动需确认三件事:访问带路由参数的URL(如?r=site/about)、检查runtime/logs/app.log中是否有“Application started”记录、在web/index.php顶部加var_dump(Yii::getVersion());die;验证类加载。

Yii 不是“配置完就能跑”的框架,它默认不带 Web 服务器,也不自动加载数据库连接——第一步必须手动确认 config/web.php 里 components['db'] 是否已正确定义且能连通。
怎么确认 Yii 应用已真正启动(而不是 500 或空白页)
很多新手看到首页没报错就以为环境 OK,其实 Yii 的错误默认只写日志、不显示在页面上。关键看三件事:
- 访问
index.php?r=site%2Fabout(或任意已注册的路由),不是直接打开index.php - 检查
runtime/logs/app.log是否有Application started记录 - 临时在
web/index.php顶部加var_dump(Yii::getVersion()); die;,确认类加载无异常
为什么 gii 生成的 Model 找不到表,或字段全为空
根本原因通常是数据库连接未生效,或表名大小写/前缀不匹配。Yii 的 yii\db\Schema 默认不自动刷新表结构缓存:
- 确保
config/db.php中的dsn包含正确库名,例如mysql:host=localhost;dbname=myapp(不是dbname=test) - 运行命令前先清空
runtime/cache/目录,否则 Gii 可能读到旧 schema 缓存 - 如果表带前缀(如
tbl_user),在 Gii 表单中填的是user,但要确认yii\db\Connection::$tablePrefix已设为'tbl_'
Controller 中调用 find() 报 Call to a member function all() on null
这是典型的 ActiveQuery 初始化失败,不是语法错误。90% 情况下是因为 Model 类没继承 yii\db\ActiveRecord,或 tableName() 返回了空字符串:
- 检查 Model 文件开头是否为
class User extends \yii\db\ActiveRecord(注意命名空间和反斜杠) - 确认
public static function tableName()返回值是字符串,不是数组或 null;例如return '{{%user}}';中的双大括号表示支持表前缀 - 若用 MySQL 8+,注意默认认证插件是
caching_sha2_password,PHP 7.4+ 需在 DSN 中显式加;charset=utf8mb4并确认 PDO MySQL 扩展已启用
部署后 assets/ 资源 404,JS/CSS 不加载
Yii 的 asset 发布机制依赖 web/assets/ 目录可写,且需 Web 服务器能解析该路径——它不是靠 PHP 路由转发的静态资源:
- 确保
web/assets/目录存在且 Web 用户(如 www-data)有写权限 - Nginx 配置中不能把
/assets/拦截为 404;应允许该路径直出,例如添加location ^~ /assets/ { } - 开发时可用
php yii asset/compress assets.php config/assets-prod.php预编译,避免上线后首次访问卡顿
最常被跳过的一步:修改 config/web.php 后,runtime/cache/ 下的配置缓存不会自动失效,必须手动删掉 config*php.bin 文件,否则改了 DB 密码也连不上。


















