web-dev-qa-db-fra.com

Mode de maintenance sans utiliser Artisan?

Je me demande simplement si quelqu'un sait s'il existe un moyen d'activer le mode de maintenance sur un site Web laravel sans utiliser Artisan? Je n'ai pas accès en ligne de commande au serveur, donc je ne peux pas utiliser Artisan sans d'abord le mettre à jour sur mon site local, puis pousser les modifications sur le serveur. Y a-t-il peut-être une route principale que je peux ajouter qui refusera l'accès à toute autre route?

Merci!

29
Steve Bauman

Vous pouvez simplement appeler artisan depuis votre application:

Artisan::call('down');

Artisan::call('up');

Mais puisque vous n'aurez pas accès à votre application, car elle est en panne. Vous pouvez créer la fonctionnalité vous-même:

Une route pour l'arrêter, l'utilisateur doit être authentifié pour ce faire:

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

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

});

Un itinéraire pour le remonter:

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

Un filtre pour vérifier s'il est en place:

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

Un itinéraire pour le remonter:

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

Un itinéraire pour afficher une jolie vue lorsque votre site est en panne

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

C'est pour Laravel 4.1 et ci-dessous

Le fichier de téléchargement de Laravel 5 est dans storage/framework/down - merci @ruuter.

En jetant un œil à la classe DownCommand pour Artisan, il semble créer un nouveau fichier dans la app/storage/meta dossier.

Voici la méthode DownCommandfire.

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

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

Et la méthode UpCommandfire correspondante.

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

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

Ces fichiers se trouvent dans vendor/laravel/framework/src/Illuminate/Foundation/Console.

Il crée spécifiquement un fichier appelé down dans app/storage/meta.

Vous pouvez créer une action de route/contrôleur autorisée pour répliquer ces commandes.

Notez le commentaire de Sjaak Trekhaa ci-dessous, c'est la méthode que j'utiliserais maintenant que je m'en souviens!

13
SamV

Laravel 4

Je voulais juste mettre ça là-bas pour tout le monde sur le web, tout php artisan down est de toucher (créer) un fichier vide dans le app/storage/meta répertoire appelé 'down'. Si ce fichier existe, l'application est en mode maintenance. C'est tout ce qu'on peut en dire:

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

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

Donc, si vous pouvez télécharger des fichiers, tout ce que vous avez à faire est de télécharger un fichier vide nommé "down" vers app/storage/meta.


Laravel 5:

Down est situé dans storage/framework/down

Merci ruuter.

7
Captain Hypertext

La vraie réponse correcte à la question est fournie ci-dessus par Antonio.

Vous pouvez simplement appeler artisan depuis votre application:

Artisan::call('down');

Artisan::call('up');

Laravel 5+

Puisque les middleware (s) ont été introduits dans Laravel 5, je vais expliquer comment je le fais dans Laravel 5.3 application).

Créez un tout nouveau middleware

Créons d'abord un nouveau middleware $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'));
    }
}

Remarque: fonction isBackendRequest() qui renvoie true ou false si nous sommes soit en administration préfixe (true) ou essayez de vous connecter (true) ou toute autre chose (false)

remplacer le middleware mondial

Ouvrez App/Http/Kernel.php Et réécrivez le middleware des fondations avec notre nouveau middleware

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

Si l'application est en mode maintenance (en bas), nous pouvons toujours accéder à la page de connexion ou à n'importe quelle page admin/*.

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

Dans laravel 5.6, l'emplacement du fichier "down" a légèrement bougé.

Son nouvel emplacement est:

./storage/framework/down

Laravel 5.6 a ajouté du contenu au fichier "down", bien qu'un fichier vide soit toujours efficace. Vous obtenez une page "503 Service non disponible", par défaut.

Supprimez simplement le fichier "down" lorsque vous avez terminé.

3
Debbie V