it-swarm.com.de

Deaktivieren Sie die Fehlerberichterstattung vollständig in der Laravel Produktion?

Ich möchte die Fehlerberichterstattung vollständig für die Produktion deaktivieren, da wir noch sehr alten Code haben, den wir noch reparieren müssen, der aber vorerst funktioniert (ja, ich mag ihn auch nicht). Wir können nicht alles in ein paar Tagen reparieren, also müssen wir einfach die Warnungen und Ausnahmen unterdrücken, wie wir es immer getan haben.

Das eigentliche Problem ist, dass es bereits eine Ausnahme für einen einfachen, faulen Fehler wie (weil var nicht definiert ist) auslöst.

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

versucht

APP_DEBUG = false

APP_LOG_LEVEL = Notfall

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

Aber es zeigt immer noch ein ErrorException

Undefinierte Variable: script_name_vars_def

edit : Der Code funktioniert so

web.php

Route::any('/someroute', '[email protected]');

somecontroller.php

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

    return response($html);
}

Auf diese Weise verwenden wir Laravel routing, ohne den alten Code sofort neu schreiben zu müssen.

Ich weiß, dass ich diese Warnung sehr einfach beheben kann, aber es gibt noch viele weitere dieser Fehler, und wir müssen jetzt Laravel routing verwenden. Beheben Sie die Probleme später.

Ideen

bearbeiten, um zu erklären, nach welchen Schritten die Middleware nicht funktioniert hat

1) Erstellen Sie Mittelware

php artisan make:middleware SuppressExceptions

2) Schreibe es

SuppressExceptions.php

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

3) Registrieren

laravel/app/Http/Kernel.php

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

Ja, Sie können die Fehlermeldung ändern. Tatsächlich bietet das Framework einen Ort, an dem die Ausnahmen abgefangen werden können: App\Exceptions\Handler. Standardmäßig konvertiert die render -Methode die ausgelöste Ausnahme in eine HTML-Antwort. Das APP_ENV und APP_DEBUG-Werte ändern nur, wie diese Fehlerantwort wiedergegeben wird (Details zur Ausnahmestapel-Ablaufverfolgung oder grundsätzlich nicht).

Versuchen Sie, die Methode render auf zu ändern

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);
}

Dies deaktiviert im Wesentlichen die Berichterstellung und versucht dann, die Anforderung erneut zu verarbeiten. In der if -Klausel können Sie nach einer beliebigen Bedingung suchen (die Klasse der Ausnahme, den Schweregrad usw.). Das Abfangen von ErrorException wird wahrscheinlich Ihre Bedürfnisse abdecken. Beachten Sie jedoch, dass Sie möglicherweise nicht in der Lage sind, einen schwerwiegenden Fehler auf diese Weise zu beheben.

Auf jeden Fall sollten Sie dies als "Proof of Concept" betrachten ... Für nicht idempotente Anfragen ist dieser "Re-Handle" -Ansatz nicht gut. Stattdessen einfach Middleware erstellen mit

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

Schwerwiegende Fehler können auf diese Weise nicht behoben werden. Sie können jedoch eine benutzerdefinierte Fehlermeldung anzeigen, in der diese Middleware mit dem vorherigen Ausnahmebehandlungsansatz kombiniert wird:

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

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

Ich vermute, Ihr php.ini Wurde von einem anderen Ort geladen. Einstellungen werden also immer noch nicht übernommen. Versuchen Sie, die richtige Position von php.ini Zu finden (Informationen finden Sie in der phpinfo()). Wie auch immer, Sie können diese Parameter mit Ihren in index.php Umschreiben:

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

Aber wie @Davon im Kommentar sagt. Diese Einstellungen werden von Laravel überschrieben. So kann der obige Code in Ihrem Controller platziert werden. Aber es wird schmutziger Hack sein. Sie müssen also einen anderen Weg finden. Versuchen Sie, den Inhalt von .env Zu drucken. Möglicherweise ist eine Einstellung falsch.

3
Alex Slipknot

Wenn das Problem darin besteht, dass Sie die Seite "Whoops something went wrong" sehen, können Sie dies mit der Antwort beheben, die @alepeino geschrieben hat:

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

Aber ich würde die Rendermethode ändern in:

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

        return response('nothing', 500);
    }

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

Diese Rendermethode (die übergeordnete Methode) erstellt den HTML-Code für die Seite "Whoops" und gibt ihn zurück. Wenn Sie ihn also überschreiben, sollten Sie cool sein.

Um die Debug-Konfiguration zu ändern, überprüfen Sie anhand des ENV-Werts APP_DEBUG, ob in Ihrer config/app.php die Debug-Optionen vorhanden sind, und überprüfen Sie, ob in Ihrer Produktions-ENV der Wert auf false gesetzt ist (APP_DEBUG = false).

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

Die zweite Zeile ändert den Wert von 'display_errors' im php.ini Datei

BEARBEITEN: Fügen Sie weiteren Code hinzu, um zu zeigen, wie dies umgebungsspezifisch sein muss ...

$ 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

Die Laravel-Debug-Einstellungen befinden sich in der Datei .env, In der Sie die Debug-Option wie folgt einstellen können:

APP_DEBUG = true

aber...

Laravel hat auch einen Konfigurationsmechanismus, der sich in app.php Im Ordner config befindet. Der Standard ist:

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

das bedeutet, dass Laravel den Wert .env verwenden soll und standardmäßig false ist. Jeder, der Zugriff auf die Datei hat, kann dies einfach ändern in:

'debug' => true,

damit dein .env Wert von Laravel ignoriert wird.

2
am05mhz

wie ich es tue, ist in

app/providers/AppServiceProvider 

in der Startfunktion

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

Laravel betont fehler- und warnungsfreien Code. Der beste Weg, dies zu tun, besteht darin, sicherzustellen, dass Ihr Code keine Fehler, Warnungen oder Hinweise erzeugt.

Update: Ich empfehle die folgende Methode nicht für neuere Versionen von Laravel. Laravel können Sie jetzt die Ausnahmebehandlung in einer Klasse ändern, die kein Hersteller ist: App\Exceptions\Handler, wie in der Antwort von alepeino angegeben. Eine Middleware kann auch eine bessere Lösung zum Deaktivieren von error_reporting sein.

Diese vorherige Antwort wird aus historischen Gründen beibehalten, ich empfehle jedoch nicht, Herstellerdateien zu ändern.


Wenn Sie sich dennoch entschließen, dieses Verhalten zu ändern, müssen Sie in einer Datei mit dem Namen HandleExceptions.php nachsehen, die sich normalerweise unter vendor/laravel/framework/src/illuminate/Foundation/Bootstrap/HandleExceptions.php befindet:

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');
    }
}

Zeile 32, in der error_reporting derzeit auf -1 gesetzt ist. https://github.com/laravel/framework/blob/5.4/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php

Wenn Sie diesen Code ändern, müssen Sie natürlich entweder Updates von laravel/framework verhindern oder diese Datei bei jedem Update überprüfen.

Nachdem Sie diesen Code aktualisiert haben, müssen Sie Ihre Klassen neu kompilieren:

php artisan clear-compiled; php artisan optimize
1
Devon