PHP schwerwiegende Fehler kommen als Statuscode 200 zum HTTP-Client zurück. Wie kann ich einen Statuscode 500 (Interner Serverfehler) zurückgeben?Wie kann ich PHP erhalten, 500 nach dem Auftreten einer schwerwiegenden Ausnahme zurückzugeben?
Antwort
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. –
@DrewSears Ich glaube nicht, dass Sie "haben" zu; Sie könnten einfach das Headerfeld 'Status' verwenden, genau wie in CGI. Aber es muss gesagt werden, dass PHP-Programmierer, die mit CGI nicht vertraut sind, die "HTTP/1.1" -Syntax einfacher zu lesen ist, weil sie eine HTTP-Antwort nachahmt. –
Seit PHP> = 5.4 gibt es die Funktion 'http_response_code ([int $ responseCode])' '. –
können Sie PHP-Fehler verwenden
Gute Antwort besteht mehr als nur auf andere Seiten zu verlinken. Sie könnten diese Seite beispielsweise kurz referieren. Was passiert, wenn die Zielseite nicht erreichbar ist oder sie diesen Inhalt verschieben? Auch sind W3Schools nicht so gute Quelle. – Olli
http://w3fools.com/ ... –
Behandlung würden Sie die geworfen Fehler zu fangen haben try/catch mit und verwenden Sie dann, dass die catch-Block eine header() mit dem 500-Fehler zu senden.
try {
...badcode...
throw new Exception('error');
} catch (Exception $e) {
header("Status: 500 Server Error");
var_dump($e->getMessage());
}
Wenn die schwerwiegende Ausnahme nicht durch try {} catch Blöcke umgeben ist, dann müssen Sie einen globalen Handler registrieren und verwenden register_shutdown_function()
für einen Fehler am Skriptende zu überprüfen.
Das wird Ausnahmen fangen, aber es wird PHP Fatal Fehler nicht abfangen, die außerhalb des Bereichs der Ausnahmen behandelt werden. –
Schwerwiegende/Syntaxfehler können nicht erfasst werden, soweit ich weiß, weder durch Fehlerbehandlung noch durch Ausnahmeverarbeitung – ChrisR
@ChrisRamakers: Ich habe etwas über die Verwendung von Ausgabe-Handlern gelesen, um PHP-fatale Fehler zu finden. –
Es ist nicht möglich PHP E_ERROR in irgendeiner Weise nach der PHP-Dokumentation zu behandeln: http://www.php.net/manual/en/function.set-error-handler.php
Auch ist möglich "E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, und die meisten von E_STRICT" zu handhaben nach zu diesem Link.
Sie können einen Handler für den anderen Fehler, Warnung und Hinweise einschließlich E_USER_ERROR bereitstellen, aber das ist wirklich nicht so nützlich wie es klingt, da dieser Fehler nur vom Programmierer mit trigger_error() absichtlich geworfen wird.
Und natürlich können Sie jede Ausnahme abfangen (sogar diejenigen, die von den nativen PHP-Funktionen ausgelöst werden).
Ich stimme zu, dass dies ein Problem ist. Server sollten nicht 200 OK zurückgeben, wenn Anwendungscode abstürzt und brennt.
Ich habe "set_exception_handler" verwendet, um nicht abgefangene Ausnahmen zu behandeln. Diese
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');
Gute Lösung, aber das wird nicht funktionieren, wenn es ein schwerer Fehler ist –
Sie können dies tun, wenn Sie mit schwerwiegenden Fehlern umgehen möchten: http://stackoverflow.com/questions/277224/how-doi-i-catch-a-php -fatal-error –
Verwenden Sie sowohl set_error_handler als auch set_exception_handler. Die erste ist für fatale Fehler im alten Stil, die zweite für objektorientierte Ausnahmen. –
ist genau das Problem, das ich hatte gestern und ich fand Lösung wie folgt:
1) vor allem, was Sie brauchen PHP fatale Fehler zu fangen, welche Fehlertyp E_ERROR ist. Wenn dieser Fehler auftritt, wird das Skript den Fehler speichern und die Ausführung beenden. Sie können den gespeicherten Fehler erhalten, indem Sie die Funktion error_get_last() aufrufen.
2) vor dem Beenden des Skripts wird immer eine Callback-Funktion register_shutdown_function() aufgerufen. Daher müssen Sie einen Fehlerhandler durch diese Funktion registrieren, um das zu tun, was Sie wollen, in diesem Fall Rückgabe-Header 500 und eine angepasste interne Fehlerseite (optional).
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 benutzerdefinierte Fehlertyp fangen wollen, die mit E_USER * starten, können Sie Funktion set_error_handler() verwenden, Fehlerbehandlung und Trigger-Fehler durch die Funktion trigger_error zu registrieren, jedoch kann dieser Fehler-Handler nicht umgehen E_ERROR Fehlertyp. Siehe Erklärung auf PHP.Netz über error handler
Stellen Sie sicher, dass Sie in einer Produktionsumgebung auch 'ini_set (" display_errors "," off ") verwenden; andernfalls werden die schwerwiegenden Fehlermeldungen zurück an den Client gesendet. – alexw
Ich schlage vor, auch nach E_PARSE zu suchen - das ist auch auf diese Weise abfragbar, vorausgesetzt, die Shutdown-Funktion ist gesetzt, bevor die Datei mit dem Parse-Fehler darin enthalten ist. – Brilliand
Nie header("HTTP/1.1 200 OK", true, 200);
als letzte Zeile eines Ausführungspfad zu setzen vergessen:
//first things first:
header("HTTP/1.1 500 Internal Server Error", true, 500);
//Application code, includes, requires, etc. [...]
//somewhere something happens
//die();
throw new Exception("Uncaught exception!");
//last things last, only reached if code execution was not stopped by uncaught exception or some fatal error
header("HTTP/1.1 200 OK", true, 200);
In PHP 5.4
Sie die header
Funktion oben mit dem viel besser http_response_code(200)
oder http_response_code(500)
ersetzen kann.
Das funktioniert nicht, wenn irgendeine Ausgabe zwischen dem ersten und letzten 'header()' Aufruf erzeugt wird, weil dann der Header bereits gesendet wurde. Arbeitsseiten können mit Status 500 ausgeliefert werden. Dieser Ansatz ist viel zu riskant. – Peter
Ausgabepufferung verwenden und nach dem Header ausgeben. Was ist offensichtlich. Wenn die Pufferung der Ausgabe in keiner Weise fehlschlägt, handelt es sich nicht um eine funktionierende Seite, sondern um eine fehlerhafte Seite. –
Das Schwierige beim Umgang mit fatalen Fehlern (Kompilierungsfehler, zB ein fehlendes Semikolon) ist, dass das Skript nicht ausgeführt wird, so dass es nicht hilft, den Statuscode in diesem Skript zu setzen. Wenn Sie jedoch ein Skript einschließen oder erfordern, wird das aufrufende Skript unabhängig von Fehlern im enthaltenen Skript ausgeführt. Damit komme ich zu dieser Lösung:
rock-solid-script.php:
// minimize changes to this script to keep it rock-solid
http_response_code(500); // PHP >= 5.4
require_once("script-i-want-to-guard-for-errors.php");
Skript-i-want-to-guard-for-errors.php:
// do all the processsing
// don't produce any output
// you might want to use output buffering
http_response_code(200); // PHP >= 5.4
// here you can produce the output
Richte deinen Anruf an die rock-solid-script.php und schon kann es losgehen.
Ich hätte es besser gemacht, den Standardstatuscode in .htaccess auf 500 zu setzen. Das scheint mir eleganter zu sein, aber ich finde keinen Weg es zu schaffen. Ich habe versucht, die RewriteRule R-Flag, aber dies verhindert die Ausführung von PHP insgesamt, so dass es keinen Nutzen hat.
Standard-PHP-Konfiguration gibt zurück 500, wenn Fehler auftritt! Stellen Sie nur sicher, dass Ihre display_errors = aus ist. Sie können es simulieren mit:
ini_set('display_errors', 0);
noFunction();
Bei der Produktion ist die display_errors-Anweisung standardmäßig deaktiviert.
meinst du fataler Fehler? – Xinus
Die Tatsache php gibt einen Fehler zurück, der nicht mit dem HTML-Header zusammenhängt, den Sie im Browser erhalten. Wenn Sie dieses Skript über die Befehlszeile ausführen, erhalten Sie keinen 200-Fehlercode –
Siehe http://stackoverflow.com/questions/2331582/catch-php-fatal-fehler für eine Lösung. – cweiske