在部署 Laravel 項目的時候,咱們常常會使用到一個提高性能的命令:laravel
php artisan optimize
本文來看看這個命令執行背後的源碼:bootstrap
首先咱們能夠使用編輯器搜 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()
找到:composer
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);
刪除。ide
肯定 $servicesPath
的代碼 $this->laravel->getCachedServicesPath()
位於 Illuminate\Foundation\Application
的 getCachedServicesPath
中:post
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
很清晰。