Режим обслуживания без использования Artisan?

Мне просто интересно, знает ли кто-нибудь, есть ли способ активировать режим обслуживания на веб-сайте laravel без использования Artisan? У меня нет доступа к серверу из командной строки, поэтому я не могу использовать Artisan, не обновив его сначала на своем локальном сайте, а затем отправив изменения на сервер. Может быть, я могу добавить основной маршрут, который будет запрещать доступ к любым другим маршрутам?

Спасибо!


person Steve Bauman    schedule 10.01.2014    source источник


Ответы (5)


Вы можете просто вызвать 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');
});
person Antonio Carlos Ribeiro    schedule 10.01.2014
comment
Потрясающе спасибо! Но где мне его разместить? Я помещаю его в маршрут или внутри контроллера, скажем, у меня есть контроллер, например: public function getIndex(){ Artisan::call('down'); } Это работает, но я не могу вызвать команду up после вызова команды down. - person Steve Bauman; 10.01.2014
comment
Неважно, просто если кто-то еще смотрит, просто поместите Artisan::call('up'); или Artisan::call('down'); в верхней части файла маршрутов. Еще раз спасибо Антонио!! - person Steve Bauman; 10.01.2014
comment
Да, это проблема. Вы можете просто воспроизвести его самостоятельно. Отредактировано. - person Antonio Carlos Ribeiro; 10.01.2014
comment
Да, круто, но вам придется изменить код приложения, чтобы его отключить. Создание функции сброса в вашем приложении поможет вам сделать это быстрее, если вам это когда-нибудь понадобится. - person Antonio Carlos Ribeiro; 10.01.2014
comment
Это правда, но пока мне нужно обновить только один файл на сервере, меня это вполне устраивает. Так что я бы сделал Artisan::call('down'); в файле маршрутов, отправьте его на сервер, затем посетите веб-сайт, который его отключит. Тогда я бы сделал наоборот, чтобы вернуть его обратно. Пока мне не нужна командная строка, это все, что мне нужно. Спасибо еще раз! - person Steve Bauman; 10.01.2014
comment
в laravel 4.1 теперь вы можете поднять сервер с помощью Artisan::call('up'); больше нечего делать :) я добавляю эту строку в route.php - person Wasim A.; 22.06.2014
comment
Возможно, было бы лучше отобразить вид вниз следующим образом: return Response::view('views.site.down', array(), 503); - person EpicVoyage; 28.06.2014
comment
Включение Artisan::call('up'); в маршрут для вывода сайта из режима обслуживания не работает и вместо этого всегда возвращает вас к App::down. Делать то же самое без указания маршрута, но только с определенной командой artisan, и она работает нормально - любой способ обернуть эту команду в маршрут, чтобы избавить от необходимости раскомментировать вызов, когда вы хотите его использовать? (У вас нет доступа к серверу из командной строки.) - person u01jmg3; 02.04.2015
comment
Мне непонятно, как может работать и функционировать маршрут (возврат обратного маршрута), когда приложение находится на обслуживании! - person Webinan; 03.06.2015

Ларавел 5

Downfile находится в storage/framework/down - спасибо @ruuter. Его нужно заполнить JSON:

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

Не уверен, где это сообщение используется, но если вам нужно настроить сообщение для страницы обслуживания, создайте resources/views/errors/503.blade.php по своему усмотрению.

Laravel 4.1 и ниже

Взглянув на класс DownCommand для Artisan, кажется, что он создает новый файл в папке app/storage/meta.

Вот метод DownCommand fire.

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

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

И соответствующий метод UpCommand fire.

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

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

Эти файлы находятся в папке vendor/laravel/framework/src/Illuminate/Foundation/Console.

Он специально создает файл с именем down в app/storage/meta.

Вы можете создать авторизованный маршрут / действие контроллера для репликации этих команд.

Обратите внимание на комментарий Sjaak Trekhaa ниже, это метод, который я бы использовал сейчас, когда мне напомнили о нем!

person SamV    schedule 10.01.2014
comment
Вы можете просто вызвать Artisan::call('down') с авторизованного маршрута/контроллера и Artisan::call('up'). Таким образом, это всегда будет работать, независимо от того, решит ли Laravel изменить путь или механизм. - person Sjaak Trekhaak; 10.01.2014
comment
Ага, не подумал об этом ;) Всегда приятно знать, что происходит за кулисами! - person SamV; 10.01.2014

Ларавель 4

Просто хотел разместить это для всех в Интернете, все, что php artisan down делает, это касается (создает) пустой файл в каталоге app/storage/meta с именем «вниз». Если этот файл существует, то приложение находится в режиме обслуживания. Вот и все:

// From vendor\laravel\framework\src\Illuminate\Foundation\Application.php

public function isDownForMaintenance()
{
    return file_exists($this['config']['app.manifest'].'/down');
}

Итак, если вы можете загружать файлы, все, что вам нужно сделать, это загрузить пустой файл с именем «вниз» на app/storage/meta.


Ларавель 5:

Вниз находится в storage/framework/down

Спасибо рутер.

person Captain Hypertext    schedule 23.03.2015

Настоящий правильный ответ на вопрос выше предоставлен Антонио.

Вы можете просто вызвать artisan из своего приложения:

Artisan::call('down');

Artisan::call('up');

Ларавель 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() возвращает true или false, если мы либо находимся в префиксе администратора (true), либо пытаемся войти в систему (true), либо что-то еще (false)

заменить глобальное промежуточное ПО

Откройте App/Http/Kernel.php и перепишите базовое промежуточное ПО с помощью нашего нового промежуточного ПО.

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

Если приложение находится в режиме обслуживания (недоступно), мы по-прежнему можем получить доступ к странице входа или любой странице admin/*.

Route::group(['middleware' => 'auth', 'prefix' => 'admin'], function () { 
    //admin routes
});  
person Kyslik    schedule 08.08.2016
comment
Работал отлично и имхо лучшее решение. Спасибо! - person McRui; 25.05.2019

В laravel 5.6 расположение «нижнего» файла немного изменилось.

Это новое местоположение:

./хранилище/каркас/вниз

Laravel 5.6 добавил некоторое содержимое в файл «down», хотя пустой файл по-прежнему эффективен. По умолчанию вы получаете страницу «503 Сервис недоступен».

Просто удалите «вниз» файл, когда вы закончите.

person Debbie V    schedule 08.08.2018
comment
отлично работал и для моего варианта использования. Спасибо - person Hasitha; 09.06.2021