Laravel 源码解读:PHP artisan down
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,最近也在送书!有兴趣的可以关注一下
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: