Maintenance mode — удаленное включение/выключение

photo-1487017159836-4e23ece2e4cf

Сегодня интеграция веба с учетными системами не новинка. Передо мной встала задача включать режим технических работ на сайте, непосредственно из учетной системы, когда данные на сайте не могут быть получены, т.к. учетная система не может отдать нужные данные. В Laravel есть консольнные команды для включения и выключения данного режима. Кроме того, есть возможность вызывать команды artisan в любом месте кода. Значит у нас все получится.

Для начала вот команды artisan

php artisan down //Переводит сайт в режим техработ
php artisan up //Соответственно возвращает сайт к нормальной работе

Вызвать команду artisan в любом месте скрипта можно так

Artisan::call('down'); // Переводит сайт в режим техработ

Итак у нас все есть, приступим к реализации. Сразу оговорюсь, что в данном примере не будет проверок на безопасность, мы рассмотрим только принцип.

Для начала создадим маршруты для включения и выключения режима техработ. Для этого в файле с маршуртами пропишим необходимый нам код:

Route::get('site-down', function () {
    Artisan::call('down');
});
Route::get('site-up', function () {
    Artisan::call('up');
});

Теперь, если перейти по ссылке http:://example.com/site-down наш сайт начнет выдавать ошибку 503 Сервис недоступен. А если мы перейдем по ссылке http:://example.com/site-up, получим ту же ошибку 🙂 Таким образом вернуть сайт назад в рабочий режим у нас не получится. Почему так происходит? Очень просто. По умолчанию во фреймворке уже существует несколько предуставноленных middleware, один из которых, как раз, и отвечает за отработку режима техработ. И теперь все, что нам нужно сделать, разобраться как с этим жить.

Для начала найдем посредник. Найти его очень просто, нужно открыть файл kernel.php из папки app\Http\ и рассмотрим кусок кода.

    protected $middleware = [
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \App\Http\Middleware\TrustProxies::class,
    ];

Как видим, первым в списке как раз тот посредник, который нам нужен. Разберемся с его содержимым:

<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode as Middleware;

class CheckForMaintenanceMode extends Middleware
{
    /**
     * The URIs that should be reachable while maintenance mode is enabled.
     *
     * @var array
     */
    protected $except = [
        //
    ];
}

И тут мы видим свойство $except в котором достаточно прописать нужный нам маршрут, для включения номарльного режима работы сайта. Добавим строчку:

protected $except = [
        'site-up'
    ];

И все заработало. Теперь можно удаленно включать и выключать режим техработ на сайте. Но это еще не все.

Если заглянуть в код Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode и при этом выполнить команду php artisan down —help, можно увидеть еще одну интересную возможность, которая позволяет обрабатывать запросы только с определнных IP адресов. Очень полезная штука, если необходимо ограничить доступ только определенным офисам, филиалам и т.п. Итак.

php artisan down --allow=127.0.0.1

Данная команда включает режим техработ, но при это все запросы с локального компьютера обрабатываются полностью.

Добавить комментарий