Laravel 原始碼解讀:PHP artisan down

JellyBool發表於2017-06-28

Laravel 的 php artisan down 命令通常是在我們維護的時候使用的,因為在執行這條命令的時候,我們的 laravel 應用就進入了維護模式,會出現一個類似於下面這個 Be Ringht Back 頁面
down-1.jpg

原始碼在哪

還是一樣,我們首先找到 artisan down 命令的原始碼所在,它位於 Illuminate\Foundation\Console\DownCommand

Tips:依然是可以直接使用編輯器搜尋 DownCommand

解讀

主體方法還是 fire():

public function fire()
    {
        file_put_contents(
            $this->laravel->storagePath().'/framework/down',
            json_encode($this->getDownFilePayload(), JSON_PRETTY_PRINT)
        );

        $this->comment('Application is now in maintenance mode.');
    }

這裡的程式碼其實非常簡單,就是使用 file_put_contents()json_encode($this->getDownFilePayload() 內容寫入storage/framework/down 檔案中,這個檔案很重要!storagePath() 就是位於 Illuminate\Foundation\Application 中的:

 public function storagePath()
    {
        return $this->storagePath ?: $this->basePath.DIRECTORY_SEPARATOR.'storage';
    }

也就是專案目錄的 storage/ 檔案路徑。

寫入的內容是什麼?

檔案內容是由 $this->getDownFilePayload() 生成,其實很簡單的,就是在 DownCommand 中:

 protected function getDownFilePayload()
    {
        return [
            'time' => Carbon::now()->getTimestamp(),
            'message' => $this->option('message'),
            'retry' => $this->getRetryTime(),
        ];
    }

這裡只返回一個陣列,記錄三個關鍵的資訊:time , message, retry;這樣看來其實我們可以自定義 Be Right Back 的字樣的吧,也可以定義提示的時間,我們可以這樣驗證:
down-2.jpg
然後這樣使用:

怎麼判斷是否是維護模式

超級簡單,就在 Laravel 的核心類 Illuminate\Foundation\Application 中,啟動之前先檢查是否是維護模式 isDownForMaintenance()

 public function isDownForMaintenance()
    {
        return file_exists($this->storagePath().'/framework/down');
    }

你看,簡單吧!它就是直接檢測 storage/framework/down 是否存在!Neat!

最後

總結就是,執行 php artisan down 命令的時候,主要是生成 storage/framework/down 檔案,包含了 time message 和 retry 三個關鍵資訊,然後在 Laravel 啟動的時候檢測 storage/framework/down 檔案是否存在就可以了。如果存在該檔案,那就認為專案處於維護狀態。

廣告時間

堅持每天更新的公眾號 codecasts,最近也在送書!有興趣的可以關注一下
wechat_small.jpg

相關文章