Yii2 採用「單一入口」模式,但區分 Web 應用與 Console 應用兩種入口文件。本文深度解析 web/index.php 與 yii 兩個入口文件的核心代碼、初始化參數、應用類實例化差異,幫助理解框架啟動生命週期的起點。
<?php
// 1. 環境常量定義(生產環境應註釋掉)
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev'); // 'dev' 或 'prod'
// 2. Composer 自動加載
require __DIR__ . '/../vendor/autoload.php';
// 3. Yii 核心類加載
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
// 4. 加載應用配置
$config = require __DIR__ . '/../config/web.php';
// 5. 實例化並運行 Web 應用
(new yii\web\Application($config))->run();
| 步驟 | 說明 |
|---|---|
| YII_DEBUG | 開啟調試模式:詳細錯誤頁面、日誌級別、性能分析器 |
| YII_ENV | 環境標識,配置文件可據此返回不同參數(如資料庫連接) |
| vendor/autoload.php | Composer PSR-4 自動加載,框架、擴展、項目類統一入口 |
| Yii.php | 定義 Yii 類(繼承 BaseYii),提供 $app、::getAlias() 等核心設施 |
| web.php 配置 | 返回陣列,含 id、basePath、components、modules 等 |
| yii\web\Application | Web 應用類,處理 HTTP 請求、路由、控制器、視圖、響應 |
| run() | 核心執行入口:handleRequest() → sendResponse() |
#!/usr/bin/env php
<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);
// CLI 環境補全 STDIN/STDOUT
defined('STDIN') or define('STDIN', fopen('php://stdin', 'r'));
defined('STDOUT') or define('STDOUT', fopen('php://stdout', 'w'));
require __DIR__ . '/vendor/autoload.php';
require __DIR__ . '/vendor/yiisoft/yii2/Yii.php';
$config = require __DIR__ . '/config/console.php';
$application = new yii\console\Application($config);
$exitCode = $application->run();
exit($exitCode);
| 維度 | Web (index.php) | Console (yii) |
|---|---|---|
| 應用類 | yii\web\Application | yii\console\Application |
| 配置文件 | config/web.php | config/console.php |
| 請求處理 | HTTP Request/Response | 命令行參數 argv/argc |
| 控制器 | yii\web\Controller | yii\console\Controller |
| 輸出方式 | HTML/JSON/檔案下載 | STDOUT/STDERR 文本 |
| 執行上下文 | Web Server (php-fpm/apache) | Shell 終端 |
| 退出碼 | 無(HTTP 狀態碼) | exit($exitCode) 顯式返回 |
Advanced 模板在 frontend/web/index.php、backend/web/index.php、console/yii、api/web/index.php 等多入口,本質上均為上述兩種模式的變體:
yii\web\Application 不同配置yii\console\Applicationcommon/config/bootstrap.php 定義 @common、@frontend、@backend、@console 別名cron.php、api.php)時,複製現有入口並調整配置路徑YII_DEBUG=0、YII_ENV=prodrun() 前可注入全局事件、中間件、性能監控'errorHandler' => ['class' => 'yii\console\ErrorHandler']// yii\base\Application
public function run() {
try {
$this->state = self::STATE_BEFORE_REQUEST;
$this->trigger(self::EVENT_BEFORE_REQUEST);
$this->state = self::STATE_HANDLING_REQUEST;
$response = $this->handleRequest($this->getRequest());
$this->state = self::STATE_AFTER_REQUEST;
$this->trigger(self::EVENT_AFTER_REQUEST);
$this->state = self::STATE_SENDING_RESPONSE;
$response->send();
$this->state = self::STATE_END;
return $response->exitStatus;
} catch (\Exception $e) {
$this->handleException($e);
}
}
Yii2 入口文件極其精簡,核心職責是「定義環境 → 載入自動加載 → 載入配置 → 實例化應用 → 運行」。理解 Web 與 Console 兩種應用類的差異,是開發多模塊、多入口、定時任務、API 服務的基礎。建議閱讀 yii\web\Application 與 yii\console\Application 源碼,掌握請求處理、路由解析、控制器創建的完整鏈路。