在部署 Laravel 專案的時候,我們經常會使用到一個提升效能的命令:
php artisan optimize
本文來看看這個命令執行背後的原始碼:
首先我們可以使用編輯器搜 OptimizeCommand
,應該就可以找到該命令原始碼的所在:Illuminate\Foundation\Console\OptimizeCommand
,我們關注其中的 fire() 方法:
public function fire()
{
$this->info('Generating optimized class loader');
if ($this->option('psr')) {
$this->composer->dumpAutoloads();
} else {
$this->composer->dumpOptimized();
}
$this->call('clear-compiled');
}
fire() 方法,預設情況下,會執行$this->composer->dumpOptimized()
,而這行程式碼觸發的其實就是composer dump-autoload --optimize
,原始碼可以在Illuminate\Support\Composer
的 dumpOptimized()
找到:
public function dumpOptimized()
{
$this->dumpAutoloads('--optimize');
}
最後,optimize
命令還執行了call('clear-compiled')
,其實就是觸發php artisan clear-compiled
,而很巧的是,我們也是可以直接使用編輯器搜ClearCompiledCommand
來找到原始碼,位於 Illuminate\Foundation\Console\ClearCompiledCommand
中,這裡的 fire()
方法其實關鍵的一步就是刪除了一下 cache
下的檔案,我們來看:
public function fire()
{
$servicesPath = $this->laravel->getCachedServicesPath();
if (file_exists($servicesPath)) {
@unlink($servicesPath);
}
$this->info('The compiled services file has been removed.');
}
通過確定 $servicesPath
的位置,再使用 @unlink($servicesPath);
刪除。
確定 $servicesPath
的程式碼 $this->laravel->getCachedServicesPath()
位於 Illuminate\Foundation\Application
的 getCachedServicesPath
中:
public function getCachedServicesPath()
{
return $this->bootstrapPath().'/cache/services.php';
}
這樣一看,其實就是將 bootstrap/cache/services.php
檔案刪除,而這個 services.php
是 Laravel 會自動生成的一個陣列檔案,這裡指定了每個 Providers 和 Facades 的位置和名稱空間的全路徑等,在啟動 Laravel 專案的時候,可以直接讀取使用。
所以這個命令可以拆為兩步:
1.composer dump-autoload --optimize // composer 層面優化載入速度
2.php artisan clear-compiled // 刪除 bootstrap/cache/services.php
很清晰。