Wie kann ich PHP dazu bringen, 500 zurückzugeben, wenn eine schwerwiegende Ausnahme auftritt?

Lesezeit: 4 Minuten

Benutzer-Avatar
Mike

Schwerwiegende PHP-Fehler werden als Statuscode 200 an den HTTP-Client zurückgegeben. Wie kann ich dafür sorgen, dass der Statuscode 500 (Interner Serverfehler) zurückgegeben wird?

  • die Tatsache, dass php einen Fehler zurückgibt, der nicht mit dem HTML-Header zusammenhängt, den Sie im Browser erhalten. Wenn Sie dieses Skript von der Befehlszeile aus ausführen, erhalten Sie keinen 200-Fehlercode

    – Gabriel Sosa

    12. Oktober 2009 um 18:27 Uhr

  • Eine Lösung finden Sie unter stackoverflow.com/questions/2331582/catch-php-fatal-error.

    – cweiske

    14. April 2011 um 11:43 Uhr

  • Ich brauche das genaue Gegenteil. Ich habe eine Shutdown-Funktion eingerichtet, die mit auto_prepend_file fängt alle fatalen Fehler ab. Allerdings will ich auch haben status code 200 gesendet, wenn diese Funktion aufgerufen wird. Aber ich bekomme immer status code 500.

    – Majid Fouladpour

    30. Juni 2015 um 14:08 Uhr

header("HTTP/1.1 500 Internal Server Error");

  • Es ist nur dumm, dass Sie die HTTP-Version manuell angeben müssen, um einen Statuscode auszugeben.

    – Zeichnete Sears

    13. Juni 2012 um 17:50 Uhr

  • @DrewSears Ich glaube nicht, dass du es “müssen” musst; du könntest einfach die verwenden Status Header-Feld wie in CGI. Aber es muss gesagt werden, dass für PHP-Programmierer, die mit CGI nicht vertraut sind, die „HTTP/1.1“-Syntax einfacher zu lesen ist, weil sie, nun ja, eine HTTP-Antwort nachahmt.

    – C. K. Young

    15. Juni 2012 um 6:02 Uhr

  • Seit PHP >= 5.4 gibt es die http_response_code([int $responseCode]) Funktion.

    – Lars Nyström

    28. Juli 2016 um 9:40 Uhr

Benutzer-Avatar
fuyi

Das ist genau das Problem, das ich gestern hatte, und ich habe folgende Lösung gefunden:

1) Zunächst müssen Sie schwerwiegende PHP-Fehler abfangen, die vom Fehlertyp E_ERROR sind. Wenn dieser Fehler auftritt, speichert das Skript den Fehler und beendet die Ausführung. Sie können den gespeicherten Fehler abrufen, indem Sie die Funktion error_get_last() aufrufen.

2) bevor das Skript beendet wird, wird immer eine Callback-Funktion register_shutdown_function() aufgerufen. Daher müssen Sie mit dieser Funktion einen Fehlerhandler registrieren, um das zu tun, was Sie möchten, in diesem Fall den Header 500 und eine angepasste interne Fehlerseite (optional) zurückzugeben.

function my_error_handler()
{
  $last_error = error_get_last();
  if ($last_error && $last_error['type']==E_ERROR)
      {
        header("HTTP/1.1 500 Internal Server Error");
        echo '...';//html for 500 page
      }
}
register_shutdown_function('my_error_handler');

Hinweis: Wenn Sie einen benutzerdefinierten Fehlertyp abfangen möchten, der mit E_USER * beginnt, können Sie die Funktion set_error_handler() verwenden, um den Fehlerhandler zu registrieren und den Fehler durch die Funktion trigger_error auszulösen. Dieser Fehlerhandler kann jedoch den Fehlertyp E_ERROR nicht verarbeiten. siehe Erklärung auf php.net über Fehlerbehandler

  • Unbedingt auch verwenden ini_set("display_errors", "off"); in einer Produktionsumgebung, andernfalls werden die schwerwiegenden Fehlermeldungen an den Client zurückgesendet.

    – alexw

    6. März 2015 um 1:55 Uhr

  • Ich schlage vor, auch nach E_PARSE zu suchen – das ist auch auf diese Weise abfangbar, vorausgesetzt, die Shutdown-Funktion wird gesetzt, bevor die Datei mit dem Parse-Fehler darin enthalten ist.

    – Brillant

    27. Oktober 2015 um 17:18 Uhr

Standard-PHP-Konfiguration tut gebe 500 zurück, wenn ein Fehler auftritt! Stellen Sie einfach sicher, dass Ihre display_errors = off. Sie können es simulieren mit:

ini_set('display_errors', 0); 
noFunction();

In der Produktion ist die display_errors-Direktive standardmäßig deaktiviert.

  • Diese sollte höher liegen. Dies ist eigentlich der richtige Weg, um den Server so einzurichten, dass er bei schwerwiegenden Fehlern 500 zurückgibt. Wenn Sie die Fehlermeldungen sehen müssen, sollten Sie das Fehlerprotokoll verwenden.

    – Dan H

    31. Juli 2018 um 10:19 Uhr

Ich habe “set_exception_handler” verwendet, um nicht abgefangene Ausnahmen zu behandeln.

function handleException($ex) {
      error_log("Uncaught exception class=" . get_class($ex) . " message=" . $ex->getMessage() . " line=" . $ex->getLine());
      ob_end_clean(); # try to purge content sent so far
      header('HTTP/1.1 500 Internal Server Error');
      echo 'Internal error';
    }

set_exception_handler('handleException');

Seit PHP >= 5.4

http_response_code(500);
echo json_encode( [ 'success' => false , 'message' => 'Crazy thing just happened!' ]);
exit();

Bitte vorher den httpCode setzen echo.

Benutzer-Avatar
Jonathan Hanson

Gemäß der PHP-Dokumentation ist es nicht möglich, PHP E_ERROR in irgendeiner Weise zu behandeln:
http://www.php.net/manual/en/function.set-error-handler.php

Es ist auch nicht möglich, “E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING und die meisten von E_STRICT” gemäß diesem Link zu behandeln.

Sie KÖNNEN einen Handler für die anderen Fehler, Warnungen und Hinweise einschließlich E_USER_ERROR bereitstellen, aber das ist wirklich nicht so nützlich, wie es klingt, da dieser Fehler nur absichtlich vom Programmierer mit trigger_error() ausgelöst wird.

Und natürlich können Sie jede Ausnahme abfangen (auch die, die von den nativen PHP-Funktionen ausgelöst wird).

Ich stimme zu, dass dies ein Problem ist. Server sollten NICHT 200 OK zurückgeben, wenn Anwendungscode abstürzt und brennt.

Benutzer-Avatar
Xinus

Sie können die PHP-Fehlerbehandlung verwenden

http://www.w3schools.com/php/php_error.asp

  • Eine gute Antwort besteht aus mehr als nur dem Verlinken auf andere Seiten. Sie könnten zum Beispiel diese Seite kurz verweisen. Was passiert, wenn die Zielwebsite nicht verfügbar ist oder diese Inhalte verschoben werden? Außerdem sind w3schools keine so gute Quelle.

    – Oli

    8. April 2012 um 17:15 Uhr

1341020cookie-checkWie kann ich PHP dazu bringen, 500 zurückzugeben, wenn eine schwerwiegende Ausnahme auftritt?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy