web-dev-qa-db-ja.com

Artisanを使用しないメンテナンスモード?

laravel WebサイトでArtisanを使用せずにメンテナンスモードをアクティブにする方法があるかどうかを誰かが知っているかどうか疑問に思っていますか?サーバーへのコマンドラインアクセスがないため、使用できませんローカルサイトで最初に更新せずに、変更をサーバーにプッシュせずに、アーティザン。

ありがとう!

29
Steve Bauman

アプリケーションから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');
});

これはLaravel 4.1以下用

Laravel 5ダウンファイルはstorage/framework/downにあります-@ruuterに感謝します。

ArtisanのDownCommandクラスを見ると、app/storage/metaフォルダー内に新しいファイルが作成されているようです。

ここにDownCommandfireメソッドがあります。

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/metadownというファイルを作成します。

これらのコマンドを複製するための承認済みルート/コントローラーアクションを作成できます。

以下のSjaak Trekhaaのコメントに注意してください。これは、私が思い出した今私が使用する方法です!

13
SamV

ララヴェル4

これをウェブ上のすべての人に公開したかっただけですが、php artisan downが行うことは、「[down]」と呼ばれるapp/storage/metaディレクトリ内の空のファイルをタッチ(作成)することだけです。このファイルが存在する場合、アプリケーションはメンテナンスモードです。これですべてです。

// 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にあります

Ruuterに感謝します。

7

質問に対する実際の正しい答えは、Antonioによって上記で提供されています。

アプリケーションから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'));
    }
}
_

:function isBackendRequest()は、管理者の場合、trueまたはfalseを返しますprefixtrue)またはログインしようとしています(true)またはその他(false

グローバルミドルウェアを置き換える

_App/Http/Kernel.php_を開き、ファンデーションミドルウェアを新しいミドルウェアで書き換えます

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

アプリケーションがメンテナンスモード(ダウン)の場合でも、ログインページや_admin/*_ページにアクセスできます。

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

laravel 5.6では、「ダウン」ファイルの場所が少し移動しました。

新しい場所は次のとおりです。

./storage/framework/down

Laravel 5.6は「ダウン」ファイルにいくつかのコンテンツを追加しましたが、空のファイルもまだ有効です。デフォルトでは、「503 Service Unavailable」ページが表示されます。

終了したら、「ダウン」ファイルを削除するだけです。

3
Debbie V