【问题标题】:Maintenance Mode without using Artisan?不使用 Artisan 的维护模式?
【发布时间】:2014-01-29 14:50:30
【问题描述】:

我只是想知道是否有人知道是否有一种方法可以在不使用 Artisan 的情况下在 laravel 网站上激活维护模式?我没有对服务器的命令行访问权限,因此如果不先在本地站点上更新它,然后将更改推送到服务器,我就无法使用 Artisan。是否有我可以添加的主路由拒绝访问任何其他路由?

谢谢!

【问题讨论】:

    标签: laravel laravel-4 laravel-5


    【解决方案1】:

    Laravel 5

    下载文件位于storage/framework/down - 谢谢@ruuter。 它需要用 JSON 填充:

    {"time": UNIXTS, "message": "", "retry": ""}
    

    不确定该消息在哪里使用,但如果您需要自定义维护页面的消息,请根据需要创建resources/views/errors/503.blade.php

    Laravel 4.1 及以下版本

    查看 Artisan 的 DownCommand 类,它似乎在 app/storage/meta 文件夹中创建了一个新文件。

    这是DownCommand fire 方法。

    public function fire()
    {
        touch($this->laravel['path.storage'].'/meta/down');
    
        $this->comment('Application is now in maintenance mode.');
    }
    

    以及对应的UpCommandfire方法。

    public function fire()
    {
        @unlink($this->laravel['path.storage'].'/meta/down');
    
        $this->info('Application is now live.');
    }
    

    这些文件位于vendor/laravel/framework/src/Illuminate/Foundation/Console

    它专门在app/storage/meta 中创建了一个名为down 的文件。

    您可以创建一个授权的路由/控制器操作来复制这些命令。

    请注意下面 Sjaak Trekhaa 的评论,这就是我现在使用的方法!

    【讨论】:

    • 您可以从授权的路由/控制器和 Artisan::call('up') 调用 Artisan::call('down')。这样,无论 Laravel 是否决定更改路径或机制,它都将始终有效。
    • 是的,没想到这一点;)知道幕后发生的事情总是很高兴!
    【解决方案2】:

    您可以从您的应用程序中调用 artisan:

    Artisan::call('down');
    
    Artisan::call('up');
    

    但是由于您的应用已关闭,因此您将无法启动它。您可以自己创建功能:

    关闭路由,用户必须经过身份验证才能执行此操作:

    Route::group(array('before' => 'auth'), function()
    {
    
        Route::get('shut/the/application/down', function() 
        {
            touch(storage_path().'/meta/my.down');
        });
    
    });
    

    恢复它的途径:

    Route::get('bring/the/application/back/up', function() 
    {
        @unlink(storage_path().'/meta/my.down');
    });
    

    一个检查它是否启动的过滤器:

    Route::filter('applicationIsUp', function()
    {
        if (file_exists($this['path.storage'].'/meta/my.down'))
        {
            return Redirect::to('site/is/down');
        }
    });
    

    恢复它的途径:

    Route::get('bring/the/application/back/up', function() 
    {
        @unlink(storage_path().'/meta/my.down');
    });
    

    当您的网站关闭时显示漂亮视图的路线

    Route::get('site/is/down', function() 
    {
        return View::make('views.site.down');
    });
    

    【讨论】:

    • 非常感谢!但是我应该把它放在哪里?我是将它放在路由中还是在控制器内部,所以说我有一个控制器,例如: public function getIndex(){ Artisan::call('down');这可行,但一旦调用了 down,我就无法调用 up 命令。
    • 是的,很酷,但是您必须更改应用程序代码才能将其关闭。如果您需要,在您的应用上创建“降低”功能将帮助您更快地完成此操作。
    • 没错,但只要我只需要更新服务器上的一个文件,我就完全可以。所以我要做的是放置 Artisan::call('down');在路由文件中,将其推送到服务器,然后访问将其关闭的网站。然后我会做相反的事情来恢复它。只要我不需要命令行,这就是我所需要的。再次感谢!
    • 在 laravel 4.1 现在你可以通过 Artisan::call('up');无事可做:) 我在 routes.php 中添加了这一行
    • 像这样呈现“向下”视图可能是更好的形式:return Response::view('views.site.down', array(), 503);
    【解决方案3】:

    Laravel 4

    只是想把它发布给网络上的每个人,php artisan down 所做的只是在app/storage/meta 目录中触摸(创建)一个名为“down”的空文件。如果此文件存在,则应用程序处于维护模式。这就是它的全部内容:

    // From vendor\laravel\framework\src\Illuminate\Foundation\Application.php
    
    public function isDownForMaintenance()
    {
        return file_exists($this['config']['app.manifest'].'/down');
    }
    

    所以如果你可以上传文件,你需要做的就是上传一个名为'down'的空文件到app/storage/meta


    Laravel 5:

    下位于storage/framework/down

    谢谢鲁特。

    【讨论】:

      【解决方案4】:

      上述问题的真正正确答案由安东尼奥提供。

      您可以从您的应用程序中调用 artisan:

      Artisan::call('down');
      
      Artisan::call('up');
      

      Laravel 5+

      由于 Laravel 5 中引入了中间件,我将介绍如何在 Laravel 5.3 应用程序中实现它。

      创建全新的中间件

      首先让我们创建新的中间件$php artisan make:middleware CheckForMaintenanceMode

      <?php
      
      namespace App\Http\Middleware;
      
      use Closure;
      use Illuminate\Foundation\Application;
      use Illuminate\Foundation\Http\Exceptions\MaintenanceModeException;
      
      class CheckForMaintenanceMode
      {
          protected $app;
      
          public function __construct(Application $app)
          {
              $this->app = $app;
          }
      
          public function handle($request, Closure $next)
          {
              if ($this->app->isDownForMaintenance() && !$this->isBackendRequest($request)) {
                  $data = json_decode(file_get_contents($this->app->storagePath() . '/framework/down'), true);
      
                  throw new MaintenanceModeException($data['time'], $data['retry'], $data['message']);
              }
      
              return $next($request);
          }
      
          private function isBackendRequest($request)
          {
              return ($request->is('admin/*') or $request->is('login'));
          }
      }
      

      注意:函数 isBackendRequest() 返回 truefalse 如果我们在管理员 prefix (true) 或尝试登录 (@ 987654328@) 或任何其他 (false)

      替换全局中间件

      打开App/Http/Kernel.php 并用我们的新中间件重写基础中间件

      protected $middleware = [
          \App\Http\Middleware\CheckForMaintenanceMode::class,
      ];
      

      如果应用程序处于维护模式(关闭),我们仍然可以访问登录页面或任何admin/* 页面。

      Route::group(['middleware' => 'auth', 'prefix' => 'admin'], function () { 
          //admin routes
      });  
      

      【讨论】:

      • 工作完美,恕我直言最好的解决方案。谢谢!
      【解决方案5】:

      在 laravel 5.6 中,“down”文件的位置略有移动。

      它的新位置是:

      ./storage/framework/down

      Laravel 5.6 在“down”文件中添加了一些内容,虽然空文件仍然有效。默认情况下,您会看到“503 服务不可用”页面。

      完成后只需删除“down”文件即可。

      【讨论】:

      • 也非常适合我的用例。谢谢
      猜你喜欢
      • 2016-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      • 2016-01-10
      相关资源
      最近更新 更多