不使用Artisan的维护模式?

Ste*_*man 29 laravel laravel-4 laravel-5

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

谢谢!

Ant*_*iro 53

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

Artisan::call('down');

Artisan::call('up');
Run Code Online (Sandbox Code Playgroud)

但是因为你没有权限获取你的应用程序,因为它已经失败了.您可以自己创建功能:

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

Route::group(array('before' => 'auth'), function()
{

    Route::get('shut/the/application/down', function() 
    {
        touch(storage_path().'/meta/my.down');
    });

});
Run Code Online (Sandbox Code Playgroud)

恢复它的途径:

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

用于检查是否已启动的过滤器:

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

恢复它的途径:

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

在您的网站停机时显示漂亮视图的路线

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

  • 在laravel 4.1现在你可以通过Artisan :: call('up')来启动服务器; 别无他法:)我在routes.php中添加此行 (2认同)

Sam*_*amV 13

这适用于Laravel 4.1及以下版本

Laravel 5 downfile在storage/framework/down- 谢谢@ruuter.

看一下DownCommandArtisan 的类,它似乎在app/storage/meta文件夹中创建了一个新文件.

这是DownCommand fire方法.

public function fire()
{
    touch($this->laravel['path.storage'].'/meta/down');

    $this->comment('Application is now in maintenance mode.');
}
Run Code Online (Sandbox Code Playgroud)

和相应的UpCommand fire方法.

public function fire()
{
    @unlink($this->laravel['path.storage'].'/meta/down');

    $this->info('Application is now live.');
}
Run Code Online (Sandbox Code Playgroud)

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

它专门创建了一个名为文件downapp/storage/meta.

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

注意下面的Sjaak Trekhaa的评论,这是我现在使用的方法,我已经被提醒了它!

  • 是的,没想到;)虽然知道幕后发生了什么事总是很好! (3认同)

Cap*_*ext 7

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');
}
Run Code Online (Sandbox Code Playgroud)

因此,如果您可以上传文件,您需要做的就是上传一个名为'down'的空文件app/storage/meta.


Laravel 5:

Down位于 storage/framework/down

谢谢鲁姆特.

  • Laravel 5`存储/框架/向下的新位置 (4认同)

Kys*_*lik 6

安东尼奥提供了真正正确的问题答案.

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

Artisan::call('down');

Artisan::call('up');
Run Code Online (Sandbox Code Playgroud)

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'));
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:函数isBackendRequest()返回true或者false如果我们在admin 前缀(true)或尝试登录(true)或其他任何东西(false)

取代全球中间件

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

protected $middleware = [
    \App\Http\Middleware\CheckForMaintenanceMode::class,
];
Run Code Online (Sandbox Code Playgroud)

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

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


Deb*_*e V 5

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

它的新位置是:

./存储/框架/向下

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

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