yii框架项目真正启动点是web/index.php:先加载autoload和yii.php,再实例化application触发完整生命周期;“yii init”仅生成模板,不参与运行时启动。

Yii 框架项目启动不是靠“初始化”命令,而是靠 Web 服务器入口文件触发自动加载和应用实例化;所谓“初始化”其实是 Yii::createObject() 和 Application 构造过程的组合,不能跳过或手动重写。
Web 入口文件(index.php)是真正的启动点
Yii 不提供类似 yii init 的“初始化项目结构”的运行时命令——那个命令只生成配置模板和空目录,不参与运行时启动。实际每次 HTTP 请求,都是从 web/index.php 开始执行:
-
require __DIR__ . '/../vendor/autoload.php';加载 Composer 自动加载器 -
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';引入核心引导文件 -
$application = new yii\web\Application($config);实例化应用对象,触发全部生命周期:配置合并、组件注册、事件绑定、模块挂载
漏掉其中任意一行(比如误删 Yii.php 引入),就会报 Class 'Yii' not found 或 Undefined class constant 'VERSION'。
Application 构造函数做了哪些关键事
传入的 $config 数组会被 yii\base\Application::__construct() 深度处理,不是简单赋值:
- 自动合并
vendor/yiisoft/yii2/base/Application.php中的默认配置(如'charset' => 'UTF-8') - 调用
set()方法注册所有'components',每个组件在首次访问时才真正实例化(延迟加载) - 执行
bootstrap数组中指定的模块或组件的bootstrap()方法(例如日志、Gii、debug 工具栏) - 设置
basePath并推导出runtimePath、viewPath等路径别名,若目录不可写会导致Failed to write file错误
常见坑:'runtimePath' => '@app/runtime' 写错为 '@runtime',或没运行 chmod -R 777 runtime/,导致缓存、日志、session 全部失效。
Yii::createObject() 和依赖注入容器的关系
虽然 Application 是手动 new 的,但内部大量使用 Yii::createObject() 创建组件,它才是 Yii DI 容器的实际入口:
- 当配置中写
'db' => ['class' => 'yii\db\Connection', 'dsn' => '...'],实际是调用Yii::createObject($config['db']) - 若类不存在或构造参数缺失(如
'dsn'为空),会直接抛出InvalidConfigException,错误信息里会明确指出哪个 key 缺失 - 自定义类必须继承
yii\base\Object(或其子类)才能支持属性批量赋值,否则Yii::createObject()会静默忽略配置项
调试技巧:在 index.php 最后加 var_dump($application->db);,能快速确认 DB 组件是否成功构建,避免查半天数据库连不上是配置问题还是网络问题。
开发环境 vs 生产环境的启动差异
启动流程一样,但行为受 YII_ENV 和 YII_DEBUG 影响极大:
-
YII_ENV=prod时,error_reporting(0),且debug和gii模块被自动禁用(即使配置写了也会跳过 bootstrap) -
YII_DEBUG=true时,所有异常堆栈展开,且Yii::getLogger()->flushInterval = 1,日志实时写入,方便排查 - 生产环境必须确保
YII_ENV=prod且YII_DEBUG=false,否则可能泄露敏感路径、SQL 或配置内容
最容易被忽略的是:Apache/Nginx 的环境变量设置方式不同(Apache 用 SetEnv,Nginx 用 fastcgi_param),设错会导致 debug 工具栏始终不出现,或错误页面显示不全。











