Laravel 的 php artisan down 命令通常是在我們維護的時候使用的,因為在執行這條命令的時候,我們的 laravel 應用就進入了維護
模式,會出現一個類似於下面這個 Be Ringht Back
頁面
原始碼在哪
還是一樣,我們首先找到 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 的字樣的吧,也可以定義提示的時間,我們可以這樣驗證:
然後這樣使用:
怎麼判斷是否是維護模式
超級簡單,就在 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,最近也在送書!有興趣的可以關注一下