Laravel php artisan optimize 源碼解讀

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

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

很清晰。

相關文章
相關標籤/搜索