2010-08-05 11 views
7

Sto sviluppando un'applicazione PHP che utilizza codici di risposta HTTP per comunicazioni e corpi di risposta. Quindi questo è un tipico scenario nel codice PHP:Come consentire ad Apache di inviare 500 in caso di errore PHP?

try { 
    doSomething(); 
} 
catch (Exception $e) { 
    header('HTTP/1.1 500 Internal Server Error'); 
} 

... e il codice tipico clienti assomiglia:

switch(responseCode) { 
    case 200 : 
     // all fine 
     // .... 
    case 500 : 
     // trouble! 
} 

Questo è cool, a patto che ogni errore è ben preso in Codice PHP

Il problema: se, per qualsiasi motivo, nel codice php occures un errore non rilevato o un errore imprendibile come errori di sintassi, Apache invierà 200 OK. Ma non ho apache per dire 500 Internal Server Error. Forse per .htaccess o così.

+1

Perché il tag JavaScript? –

+0

Aveva in mente un client javascript in mente. Rimosso il tag. – hek2mgl

+0

Spiacente, ho aggiornato la mia risposta. –

risposta

2

È possibile, ovviamente, write your own error handler. Tuttavia, non tutti gli errori PHP sono catchable. Ad esempio, un errore di sintassi non consente nemmeno l'esecuzione del codice, incluso il gestore degli errori.

Per gestire gli errori catchable, è possibile utilizzare le direttive auto_append_file e auto_prepend_file per inserire il codice codice di gestione degli errori.

Gli errori non catchable sono un altro problema. Se PHP viene eseguito come Fast CGI, genererà automaticamente un codice di stato di 500 per te. Tuttavia, probabilmente stai eseguendo PHP attraverso altri SAPI (come il modulo Apache). Non ne ho idea, mi dispiace. (Riceverò una segnalazione se trovo qualcosa.)

+0

Grazie per la rapida risposta! Sì, ho scritto un gestore di errori ed eccezioni personalizzato, ma hai ragione, gli errori non rilevabili sono il problema. Su questo sto cercando su google ... – hek2mgl

+0

Qualunque cosa, è abbastanza raro che un tale tipo di errori fatali vada inosservato, non è vero? –

+0

errori di sintassi e altri errori irreversibili non possono essere rilevati da alcun gestore di errori – stillstanding

2

Le intestazioni di risposta non vengono inviate fino al di PHP eche il primo byte del corpo della risposta. È possibile modificare le intestazioni (e il codice di stato) nel frattempo. Tenendo presente ciò, ecco una soluzione:

Impostare lo script per inviare un codice di risposta 500 all'inizio dello script e 200 alla fine. Ecco un esempio:

header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error'); 

if (rand(0, 1) == 1) { 
    die("Script terminated prematurely"); 
} 

header($_SERVER['SERVER_PROTOCOL'] . ' 200 OK'); 
echo "Success"; 

Basta assicurarsi che il codice 200 risposta è impostata in un solo punto nel codice.

Nota: è possibile utilizzare http_response_code (PHP> = 5.4) anziché header.

+0

Bella idea +1 :) Ma verrà comunque inviato 200 OK se per esempio viene generato un errore di sintassi (fatale). – hek2mgl

+0

Almeno su PHP> = 5.3.19 uno script con errori di sintassi genera 500 errori. Nessuno vorrebbe avere un tale script su un server di produzione comunque. –

2

Al giorno d'oggi non è più un problema - dal 5.3 PHP imparato finalmente di inviare 503 in caso di errore, non 200

Err, a quanto pare è stato 5.2.4:

gestore degli errori cambiato per inviare HTTP 500 anziché pagina vuota su errori PHP.

è necessario impostare display_errors = off per farlo funzionare

Ho l'esatto comportamento sul mio Windows Apache 2.4 con PHP 5.4.5

+0

Ho provato con PHP 5.3.10. Ad esempio, un errore di sintassi darà comunque 200 OK. In quali circostanze PHP invierà il 503? – hek2mgl

+0

Il tuo aggiornamento sembra fantastico !! Ma non funziona ancora per me. Ho provato con PHP 5.3.10-1ubuntu3.4. Ho usato una semplice pagina di errore di sintassi ' hek2mgl

+0

@YourCommonSense, esistono dei modi per temporanea ignorare il comportamento 5.2.4, costringendolo a mostrare una pagina vuota sugli errori PHP? – Pacerier

Problemi correlati