web-dev-qa-db-fra.com

Désactiver le rapport d'erreurs entièrement dans Laravel production?

Je voudrais désactiver entièrement le rapport d'erreurs sur la production, car nous avons un code très ancien que nous devons encore corriger, mais pour l'instant cela fonctionne (oui, je ne l'aime pas non plus). Nous ne pouvons pas tout réparer en quelques jours, nous devons donc simplement supprimer les avertissements et les exceptions comme nous l'avons toujours fait.

Le vrai problème est qu'il lève déjà une exception sur un simple bug paresseux comme (car var n'est pas défini)

if(!$var) {
     // do whatever
}

essayé

APP_DEBUG = false

APP_LOG_LEVEL = urgence

display_errors(false);
set_error_handler(null);
set_exception_handler(null);

Mais il montre toujours un ErrorException

Variable non définie: nom_ script_vars_def

edit : Le code fonctionne comme ceci

web.php

Route::any('/someroute', 'somecontroller@controllerFunc');

somecontroller.php

public controllerFunc() {
    ob_start();
    require '/old_index.php';
    $html = ob_get_clean();

    return response($html);
}

De cette façon, nous utilisons Laravel le routage sans avoir à réécrire immédiatement l'ancien code.

Je sais que je peux résoudre cet avertissement très facilement, mais il y a beaucoup, beaucoup plus de ces erreurs et nous devons utiliser le routage Laravel maintenant. Corrigez les problèmes plus tard.

idées

modifier pour expliquer après quelles étapes le middleware n'a pas fonctionné

1) créer un logiciel intermédiaire

php artisan make:middleware SuppressExceptions

2) Écrivez-le

SuppressExceptions.php

public function handle($request, Closure $next)
{
    error_reporting(0);
    return $next($request);
}

3) S'inscrire

laravel/app/Http/Kernel.php

protected $middlewareGroups = [
   'web' => [
       \App\Http\Middleware\SuppressExceptions::class,
],
12
online Thomas

Oui, vous pouvez modifier le rapport d'erreur. En fait, le cadre fournit un endroit pour intercepter les exceptions: App\Exceptions\Handler. Par défaut, la méthode render convertira l'exception levée en réponse HTML. Le APP_ENV et APP_DEBUG les valeurs ne changeront que le rendu de cette réponse d'erreur (détails sur la trace de la pile d'exceptions ou non, en gros).

Essayez de changer la méthode render en

public function render($request, Exception $exception)
{
    if ($exception instanceof ErrorException) {
        error_reporting(0);

        $kernel = app(\Illuminate\Contracts\Http\Kernel::class);
        $response = $kernel->handle($request)->send();
        return $kernel->terminate($request, $response);
    }

    return parent::render($request, $exception);
}

Cela désactive essentiellement la création de rapports, puis tente de retravailler la demande. Dans la clause if, vous pouvez rechercher toute condition souhaitée (la classe de l'exception, la gravité, etc.). Attraper ErrorException couvrira probablement vos besoins, mais notez que vous ne pourrez peut-être pas récupérer d'une erreur fatale de cette façon.

Quoi qu'il en soit, vous devriez considérer cela comme une "preuve de concept" ... Pour les demandes non idempotentes, cette approche de "re-handle" n'est pas bonne. Au lieu de cela, juste créer un middleware avec

public function handle($request, Closure $next)
{
    error_reporting(0);
    return $next($request);
}

Comme précédemment, les erreurs fatales ne peuvent pas être récupérées de cette façon. Mais vous pouvez afficher un message d'erreur personnalisé combinant ce middleware avec l'approche du gestionnaire d'exceptions d'avant:

public function render($request, Exception $exception)
{
    if ($exception instanceof FatalErrorException) {
        return view('fatal-error', ['exception' => $exception]);
    }

    return parent::render($request, $exception);
}
8
alepeino

Je suppose que votre php.ini Est chargé depuis un autre endroit. Les paramètres ne sont donc toujours pas appliqués. Essayez de trouver l'emplacement correct de php.ini (Vous pouvez voir les informations dans la phpinfo()). Quoi qu'il en soit, vous pouvez réécrire ces paramètres avec les vôtres dans index.php:

error_reporting(0);
ini_set('display_errors', 0);
ini_set('display_startup_errors', 0);

Mais comme le dit @Davon dans le commentaire. Ces paramètres seront remplacés par Laravel. Le code ci-dessus peut donc être placé dans votre contrôleur. Mais ce sera un hack sale. Vous devez donc trouver un autre moyen. Essayez d'imprimer le contenu de votre .env. Peut-être que certains paramètres sont incorrects.

3
Alex Slipknot

Si le problème est que vous voyez la page `` Oups, quelque chose s'est mal passé '', vous pouvez résoudre ce problème avec la réponse @alepeino a écrit:

https://stackoverflow.com/a/44862789/277797

Mais je changerais la méthode de rendu en:

public function render($request, Exception $exception)
{
    if (!config('app.debug')) {
        error_reporting(0);

        return response('nothing', 500);
    }

    return parent::render($request, $exception);
}

Cette méthode de rendu (le parent) est celle qui construit et renvoie le code HTML de la page "Whoops", donc si vous la remplacez, vous devriez être cool.

Pour modifier la configuration de débogage, vérifiez si votre config/app.php a les options de débogage en utilisant la valeur ENV APP_DEBUG, et sur votre production .env, vérifiez qu'il est défini sur false (APP_DEBUG = false).

2
Juan Pablo
error_reporting(0);
ini_set('display_errors', 0);

La deuxième ligne modifie la valeur de 'display_errors' dans le php.ini fichier

EDIT: Ajoutez plus de code pour montrer comment cela doit être spécifique à l'environnement ...

$ env = getenv ('APPLICATION_ENV');

 switch ($env) {
        case 'production':
            error_reporting(0);
            $config = include __DIR__ . '/../app/config/config_prod.php';
            break;

        case 'staging':
            ini_set('display_errors', 1);
            $config = include __DIR__ . '/../app/config/config_staging.php';
            break;

        case 'development':
        case 'local':
        default:
            ini_set('display_errors', 1);
            $config = include __DIR__ . '/../app/config/config_local.php';
            break;
2
Pila

Les paramètres de débogage de Laravel se trouvent dans le .env fichier, dans lequel vous pouvez définir l'option de débogage comme suit:

APP_DEBUG = true

mais...

Laravel a également un mécanisme de configuration situé dans app.php dans le dossier config, par défaut:

'debug' => env('APP_DEBUG', false),

qui indique Laravel pour utiliser le .env valeur, et par défaut false, mais toute personne ayant accès au fichier peut simplement le changer en:

'debug' => true,

pour que votre .env la valeur est ignorée par Laravel.

2
am05mhz

comment je fais est

app/providers/AppServiceProvider 

dans la fonction de démarrage

public function boot()
{
   //add error reporting level
   error_reporting(0);
}
1
danny

Laravel met l'accent sur le code sans erreur ni avertissement, donc la meilleure façon de gérer cela est simplement de vous assurer que votre code ne produit aucune erreur, avertissement ou avis.

Mise à jour: je ne recommande pas la méthode ci-dessous pour les versions récentes de Laravel. Laravel vous permet désormais de modifier la gestion des exceptions dans une classe non-fournisseur: App\Exceptions\Handler comme indiqué par la réponse d'alepeino. Un middleware peut également être une meilleure solution pour désactiver error_reporting.

Cette réponse précédente est conservée à des fins historiques, mais je ne recommande pas de modifier les fichiers des fournisseurs.


Si, cependant, vous décidez toujours de modifier ce comportement, vous devrez rechercher dans un fichier nommé HandleExceptions.php normalement trouvé dans vendor/laravel/framework/src/illuminate/Foundation/Bootstrap/HandleExceptions.php:

public function bootstrap(Application $app)
{
    $this->app = $app;
    error_reporting(-1); // change this line to your desired reporting level
    set_error_handler([$this, 'handleError']);
    set_exception_handler([$this, 'handleException']);
    register_shutdown_function([$this, 'handleShutdown']);
    if (! $app->environment('testing')) {
        ini_set('display_errors', 'Off');
    }
}

Ligne 32 où error_reporting est actuellement défini sur -1. https://github.com/laravel/framework/blob/5.4/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php

Bien entendu, en modifiant ce code, vous devrez soit empêcher les mises à jour de laravel/framework, soit vérifier ce fichier à chaque mise à jour.

Après avoir mis à jour ce code, vous devrez recompiler vos classes:

php artisan clear-compiled; php artisan optimize
1
Devon