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
$dontReport
.@
suppression au bon endroitmodifier 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,
],
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);
}
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.
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).
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;
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.
comment je fais est
app/providers/AppServiceProvider
dans la fonction de démarrage
public function boot()
{
//add error reporting level
error_reporting(0);
}
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