文档章节

Laravel框架学习 -- php artisan down/up

明天以后
 明天以后
发布于 2016/06/09 00:57
字数 916
阅读 639
收藏 3

    由于某种原因,公司整体框架由python的flask框架,转换为php的laravel。在断断续续几个月的时间里,边继续写着flask框架,边学着laravel。说下自己现在的状态吧。前段时间差不多都在个1-2点睡觉,大概四月份有段时间竟然到了3-4点才睡的地步。

    路漫漫其修远兮,总感觉时间不够用的。大概是自己之前浪费的时间太多了,是时候还上了。


    laravel文档中文版的,大概看到过三个。随便找个看看就可以了。http://laravel-china.org/docs/5.1 

# 输入 php artisan 即可看到全部可用命令

  down                 Put the application into maintenance mode
  up                   Bring the application out of maintenance mode

    整体流程大体(因为详细的我也不是很清楚╮(╯_╰)╭)说下吧。

一、命令的实现

    1. 作为服务提供者,加载到程序中。

// config/app.php 中。
'providers' => [
    // 这个便是 laravel自带的 artisan 命令提供者
    Illuminate\Foundation\Providers\ArtisanServiceProvider::class,
]

    2.然后找到 Up/Down 命令入口

/**
 * Register the command.
 *
 * @return void
 */
protected function registerUpCommand()
{
    $this->app->singleton('command.up', function () {
        return new UpCommand;
    });
}


/**
 * Register the command.
 *
 * @return void
 */
protected function registerDownCommand()
{
    $this->app->singleton('command.down', function () {
        return new DownCommand;
    });
}

    3.1 DownCommand实现

class DownCommand extends Command
{
    /**
     * The console command name.
     *
     * @var string
     */
    protected $name = 'down';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Put the application into maintenance mode';

    /**
     * Execute the console command.
     *
     * @return void
     */
    public function fire()
    {
        // 关键点: 在当前存储目录/framework 下面创建一个 down文件
        touch($this->laravel->storagePath().'/framework/down');

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


// touch() 函数php文档解释
/**
 * Sets access and modification time of file
 * @link http://php.net/manual/en/function.touch.php
 * @param string $filename <p>
 * The name of the file being touched.
 * </p>
 * @param int $time [optional] <p>
 * The touch time. If time is not supplied, 
 * the current system time is used.
 * </p>
 * @param int $atime [optional] <p>
 * If present, the access time of the given filename is set to 
 * the value of atime. Otherwise, it is set to
 * time.
 * </p>
 * @return bool true on success or false on failure.
 * @since 4.0
 * @since 5.0
 */
function touch ($filename, $time = null, $atime = null) {}

    3.2 UpCommand 实现

class UpCommand extends Command
{
    /**
     * The console command name.
     *
     * @var string
     */
    protected $name = 'up';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Bring the application out of maintenance mode';

    /**
     * Execute the console command.
     *
     * @return void
     */
    public function fire()
    {
        // 关键:删除laravel存储目录/fromework 下面的 down 文件
        @unlink($this->laravel->storagePath().'/framework/down');

        $this->info('Application is now live.');
    }
}


// @unlink() php文档解释
/**
 * Deletes a file
 * @link http://php.net/manual/en/function.unlink.php
 * @param string $filename <p>
 * Path to the file.
 * </p>
 * @param resource $context [optional] &note.context-support;
 * @return bool true on success or false on failure.
 * @since 4.0
 * @since 5.0
 */
function unlink ($filename, $context = null) {}

 

二、如何工作的

    1. 当然是使用中间件了

// Http/Kernel.php 文件里面
class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * @var array
     */
    protected $middleware = [
        
        // 就是这个东西了
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    ];
}

    2. 继续看中间件的实现

class CheckForMaintenanceMode
{
    /**
     * The application implementation.
     *
     * @var \Illuminate\Contracts\Foundation\Application
     */
    protected $app;

    /**
     * Create a new middleware instance.
     *
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @return void
     */
    public function __construct(Application $app)
    {
        $this->app = $app;
    }

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     *
     * @throws \Symfony\Component\HttpKernel\Exception\HttpException
     */
    public function handle($request, Closure $next)
    {
       
        // 当这个条件成立时,直接抛出 HttpException(503) 异常。
        // 默认情况下,该请求会直接显示 resources/views/errors/503.blade.php 页面
        if ($this->app->isDownForMaintenance()) {
            throw new HttpException(503);
        }

        return $next($request);
    }
}



// 再看 isDownForMaintenance() 函数

/**
 * Determine if the application is currently down for maintenance.
 *
 * @return bool
 */
public function isDownForMaintenance()
{
    // 重点:判断一下 laravel的storagePath/framework 下面是否存在 down 文件
    return file_exists($this->storagePath().'/framework/down');
}


总结:

其实呢,这些只是一个抛砖引玉的过程。只是拿框架的一个小东西来扯扯而已。还是那句话:路漫漫其修远兮。加油吧,少年~

1.  php artisan down => 在storagePath/framework 下面创建 down文件; php artisan up => 删除 down 创建 down文件

2.  laravel 默认中间件,检查storagePath/framework 下面是否存在down文件,若存在则抛出503异常

© 著作权归作者所有

明天以后

明天以后

粉丝 76
博文 130
码字总数 87367
作品 0
昌平
程序员
私信 提问
Laravel学习笔记之一

1:Laravel的启动 切换到laravel项目下 www/my_laravel 开启laravel服务 php artisan serve 2:快速创建一个laravel控制器/模型 php artisan make:controller NameController; php artisan ......

雨醉风尘
2016/04/17
67
0
laravel中artisan工具(命令)的使用详解

artisan工具,首先,这个是一个php文件,它放在我们laravel框架的根目录 Artisan工具简介 Artisan 是 Laravel 中自带的命令行工具的名称。它提供了一些对您的应用开发有帮助的命令。它是由强大的...

bengozhong
2018/07/06
758
0
laravel一些特别爽的指令php artisan

刚开始玩laravel的时候,遇到的每一个问题,我是手动创建,然后粘贴复制,命名空间,有时候还会报错,太麻烦了,最近做项目,偶然间发现了新大陆,哈哈哈,就是php artisan这个指令,据说,a...

老鼠会怕喵
2016/12/21
1K
3
laravel commands自定义命令

laravel框架根目录下运行:php artisan make:command RedisSubscribe //创建命令文件 然后可以在laravel框架根目录下调用artisan运行这个命令:php artisan redis:subscribe...

郭周园
04/02
9
0
Laravel框架学习 -- 安装

环境:mac os 10.10.5; php 5.6.9; 文档参考: http://www.golaravel.com/ 包管理: python 一般使用 pip Laravel 利用 Composer(Composer 中文)来管理其自身的依赖包。 安装: lpe234@lpe...

明天以后
2015/11/17
531
0

没有更多内容

加载失败,请刷新页面

加载更多

MongoDB系列-在复制集(replication)以及分片(Shard)中创建索引

关注我,可以获取最新知识、经典面试题以及微服务技术分享   在使用MongoDB时,在创建索引会涉及到在复制集(replication)以及分片(Shard)中创建,为了最大限度地减少构建索引的影响,在副本...

ccww_
28分钟前
25
0
SAP HANA数据库multi container模式JDBC链接connection refused

报错如下信息 com.sap.db.jdbc.exceptions.JDBCDriverException: SAP DBTech JDBC: Cannot connect to jdbc:sap://xxx.xxx.xxx.xxx:30015 [Cannot connect to host xxx.xxx.xxx.xxx:30015 [C......

flash胜龙
54分钟前
45
0
c++ 虚基类

c++ 虚基类 p556

天王盖地虎626
今天
97
0
k8s删除Terminating状态的命名空间

背景: 我们都知道在k8s中namespace有两种常见的状态,即Active和Terminating状态,其中后者一般会比较少见,只有当对应的命名空间下还存在运行的资源,但是该命名空间被删除时才会出现所谓的...

Andy-xu
今天
94
0
seata源码阅读笔记

seata源码阅读笔记 本文没有seata的使用方法,怎么使用seata可以参考官方示例,详细的很。 本文基于v0.8.0版本,本文没贴代码。 seata中的三个重要部分: TC:事务协调器,维护全局事务和分支...

东都大狼狗
今天
57
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部