Laravel php artisan optimize 原始碼解讀

weixin_33763244發表於2017-06-25

原文:https://www.codecasts.com/blo...

在部署 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\ComposerdumpOptimized() 找到:

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\ApplicationgetCachedServicesPath 中:

 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

很清晰。

相關文章