Gli errori fatali di PHP tornano come codice di stato 200 al client HTTP. Come posso restituire un codice di stato 500 (Errore interno del server)?Come posso ottenere php per restituire 500 quando si verifica un'eccezione irreversibile?
risposta
header("HTTP/1.1 500 Internal Server Error");
È semplicemente sciocco dover specificare manualmente la versione HTTP per emettere un codice di stato. –
@DrewSears Non penso che tu "abbia"; potresti semplicemente usare il campo di intestazione 'Status' proprio come in CGI. Ma bisogna dire che per i programmatori PHP che non conoscono CGI, la sintassi "HTTP/1.1" è più facile da leggere, perché, simula una risposta HTTP. –
Poiché PHP> = 5.4 esiste la funzione 'http_response_code ([int $ responseCode])'. –
È possibile utilizzare la manipolazione
Una buona risposta consiste in più del semplice collegamento ad altre pagine. Potresti ad esempio riferire quella pagina a breve. Cosa succede quando il sito di destinazione è inattivo o sposta quel contenuto? Inoltre, w3schools non è una buona fonte. – Olli
http://w3fools.com/ ... –
errore php che avrebbe dovuto rilevare l'errore gettato utilizzando try/catch e quindi utilizzare tale blocco catch per inviare un header() con l'errore 500.
try {
...badcode...
throw new Exception('error');
} catch (Exception $e) {
header("Status: 500 Server Error");
var_dump($e->getMessage());
}
Se l'eccezione irreversibile non è circondato da try {} blocchi catch, allora è necessario registrare un gestore globale e utilizzare register_shutdown_function()
per verificare la presenza di un errore alla fine dello script.
In questo modo verranno rilevate eccezioni, ma non verranno rilevati errori irreversibili di PHP, che vengono gestiti al di fuori dell'ambito delle eccezioni. –
Gli errori fatali/di sintassi non possono essere catturati per quanto ne so, né per gestione degli errori né per gestione delle eccezioni – ChrisR
@ChrisRamakers: Ho letto qualcosa sull'utilizzo dei gestori di output per rilevare gli errori fatali di PHP. –
Non è possibile gestire PHP E_ERROR in alcun modo in base alla documentazione di PHP: http://www.php.net/manual/en/function.set-error-handler.php
Né è possibile gestire "E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, e la maggior parte E_STRICT", secondo a questo link.
È possibile fornire un gestore per l'altro errore, avviso e notifiche incluso E_USER_ERROR, ma in realtà non è così utile come sembra, poiché questo errore viene generato intenzionalmente dal programmatore con trigger_error().
E naturalmente è possibile rilevare qualsiasi eccezione (anche quelle generate dalle funzioni PHP native).
Sono d'accordo che questo è un problema. I server NON devono restituire 200 OK quando il codice dell'applicazione si blocca e brucia.
Ho usato "set_exception_handler" per gestire le eccezioni non rilevate.
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');
Buona soluzione ma non funzionerà se si tratta di un errore irreversibile –
È possibile eseguire questa operazione se si desidera gestire errori irreversibili: http://stackoverflow.com/questions/277224/how-do-i-catch-a-php -fatal-error –
Usa sia set_error_handler che set_exception_handler. Il primo è per errori fatali vecchio stile, il secondo è per eccezioni orientate agli oggetti. –
questo è esattamente il problema che ho avuto ieri e ho trovato la soluzione come segue:
1) prima di tutto, è necessario prendere PHP errori fatali, che è tipo di errore E_ERROR. quando si verifica questo errore, lo script verrà memorizzato l'errore e terminerà l'esecuzione. è possibile ottenere l'errore memorizzato chiamando la funzione error_get_last().
2) prima dello script terminato, verrà sempre richiamata una funzione di callback register_shutdown_function(). quindi è necessario registrare un gestore di errori con questa funzione per fare ciò che si desidera, in questo caso, restituire l'intestazione 500 e una pagina di errore interna personalizzata (opzionale).
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');
Nota: se volete prendere tipo di errore personalizzato, che inizia con E_USER *, è possibile utilizzare la funzione set_error_handler() per registrare gestore di errori ed errori di trigger per funzione trigger_error, tuttavia, questo gestore di errore non può gestire E_ERROR tipo di errore. vedere la spiegazione su php.rete circa error handler
Assicurarsi di utilizzare anche 'ini_set (" display_errors "," off ");' in un ambiente di produzione, altrimenti i messaggi di errore irreversibili verranno inviati al client. – alexw
Suggerisco di controllare anche E_PARSE, che è anche selezionabile in questo modo, purché la funzione di spegnimento sia impostata prima che il file con l'errore di analisi sia incluso. – Brilliand
Mai dimenticare di impostare header("HTTP/1.1 200 OK", true, 200);
come l'ultima linea di qualsiasi percorso di esecuzione:
//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
è possibile sostituire la funzione header
sopra con la migliore http_response_code(200)
o http_response_code(500)
.
Questo non funziona se viene generato un output tra la prima e l'ultima chiamata 'header()', perché allora l'intestazione sarà già stata inviata. Le pagine di lavoro possono essere fornite con lo stato 500. Questo approccio è troppo rischioso. – Peter
Utilizza il buffer di output e l'output dopo l'intestazione. Che è ovvio Se il buffering dell'output fallisce in qualche modo, non è una pagina funzionante, è una pagina buggy. –
La cosa difficile quando si gestiscono errori fatali (errori di compilazione, ad esempio un punto e virgola mancante) è che lo script non verrà eseguito, quindi non aiuterà a impostare il codice di stato in quello script. Tuttavia, quando includi o richiedi uno script, lo script chiamante verrà eseguito, indipendentemente dagli errori nello script incluso. Con questo, io vengo a questa soluzione:
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");
sceneggiatura-i-want-to-guard-per-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
Dirigi la tua chiamata a rock-solid-script.php e sei pronto per partire.
Mi sarebbe piaciuto meglio impostare il codice di stato predefinito su 500 in .htaccess. Mi sembra più elegante, ma non riesco a trovare il modo di farcela. Ho provato il R-flag RewriteRule, ma questo impedisce del tutto l'esecuzione del php, quindi è inutile.
Configurazione PHP standard fa restituisce 500 quando si verifica un errore! Assicurati che il tuo display_errors = off. È possibile simularlo con:
ini_set('display_errors', 0);
noFunction();
In produzione la direttiva display_errors è disattivata per impostazione predefinita.
intendi errore fatale? – Xinus
il php restituisce un errore non correlato all'intestazione HTML che si ottiene nel browser. Se esegui lo script dalla riga di comando, non riceverai alcun codice di errore 200 –
Consulta http://stackoverflow.com/questions/2331582/catch-php-fatal-error per una soluzione. – cweiske