2011-08-22 20 views
6

Ho recentemente acquisito lo sviluppo di un sistema legacy e voglio essere in grado di attivare la registrazione di PHP E_NOTICE nell'ambiente di distribuzione. L'ambiente di distribuzione ini ha le seguenti direttive ...Errori di registrazione PHP in registrazione

error_reporting = E_ALL & ~E_DEPRECATED 
display_errors = Off 
log_errors = On 

Ho confrontato il error_reporting maschera di bit utilizzando echo (E_ALL & ~E_DEPRECATED).' = '.error_reporting();, ed entrambi match, quindi so il livello error_reporting non viene modificato all'interno del sistema stesso, e se io attiva le notifiche display_errors = On ma non vengono registrate.

Quindi, come posso iniziare a registrare PHP E_NOTICE?

+0

A meno che non mi manchi qualcosa, dovrebbe già esserci già un avviso di registrazione. Hai controllato se sta usando un gestore di errori personalizzato? –

+0

@ Álvaro G. Vicario - i miei pensieri esattamente. Non esiste un gestore di errori personalizzato, quando accendo la visualizzazione degli errori (display_errors = On), le notifiche vengono visualizzate, ma non registrate! – chattsm

+0

Per iniziare a ridurre il problema, è possibile dimenticare il codice effettivo e provare [questo semplice frammento] (http://pastebin.com/6NCRcaUd). –

risposta

1

scopre il sistema ha un costume Apache direttiva ErrorLog definito, e mi sono stati tail -f ... Apache error_log di default .

Nota per sé: controllare sempre la configurazione del server Web prima di inviare domande stupide su SO!

0

È possibile creare il proprio gestore

<?php 


function myErrorHandler($errno, $errstr, $errfile, $errline) 
{ 
    if ($errno == E_USER_NOTICE){ 
     /* log actions here */ 
    } 
} 

set_error_handler("myErrorHandler"); 
+0

Vorrei evitare di aggiungere un gestore di errori personalizzato, questo non risolve il problema di visualizzazione di avvisi quando accendo display_errors = On, ma non registro ancora. – chattsm

2

Aggiornamento:

Secondo @mpc nei commenti su questa risposta, gli errori vengono visualizzati nel browser quando display_errors è in, ma non compaiono nel registro Supponevo che gli errori non apparissero affatto.

Gli errori E_NOTICE sono gli unici che non vengono visualizzati nel registro o sono interessati tutti i tipi di errore? Se sono tutti i tipi di errore, la prima cosa che verificherei è se la registrazione degli errori è abilitata o meno. Prova a impostare ini_set('log_errors', 'On'); nella parte superiore del tuo script. Se ciò non funziona, prova a impostare il tuo file di registro su qualcosa che è sicuro al al quale il tuo server può scrivere chiamando lo ini_set('error_log', 'your_file_path');. Se nessuno di questi funziona, allora penso che qualcosa sia seriamente sbagliato nell'installazione di PHP. Se una di queste correzioni funziona, puoi inserirle nel tuo attuale php.ini se hai accesso.


risposta originale:

Sulla base del livello error_reporting nella sua interrogazione, il vostro PHP installare dovrebbe già essere configurato per segnalare E_NOTICE errori. Se non registra questi errori, qualcosa non va. Vorrei suggerire di attivare display_errors per vedere se vengono visualizzati errori E_NOTICE. Se non riesci a modificare il file php.ini, prova a eseguire ini_set('display_errors', 'On'); nella parte superiore dello script. Ovviamente, questi errori verranno visualizzati e/o registrati solo se ne attivi uno, quindi dovresti ricontrollare che lo stai facendo in qualche modo.

Un avvertimento è che il livello di errore E_DEPRECATED è stato introdotto solo con PHP 5.3. Quando ho appena testato l'impostazione E_DEPRECATED su un'installazione di PHP 5.2, PHP ha risposto con errori e impostato il livello error_reporting su 0, il che significa che riporta senza errori. Mentre non ha senso che un file 5.3 php.ini pre-5.3 utilizzi questa impostazione, ritengo sia importante almeno aumentare la possibilità che tu stia utilizzando E_DEPRECATED su un server che non lo supporta. Se non sei sicuro della tua versione, puoi eseguire phpinfo() e visualizzerà una pagina con molte e molte informazioni, incluso il numero di versione per l'installazione.

Nonostante quanto sopra, se ho frainteso la tua domanda e stai solo parlando di creare il tuo log personalizzato, allora devi creare una funzione da eseguire quando si verifica un errore e assegnarlo come gestore di errori usando il Funzione set_error_handler().

È importante notare che quando si utilizza set_error_handler(), si ignora completamente il gestore di errori predefinito di PHP. Ciò significa che il tuo livello error_handler diventa privo di significato. Tutti gli errori, indipendentemente dalla loro gravità, verranno passati alla funzione di gestore degli errori che hai creato. Il primo parametro passato a questa funzione da PHP sarà il numero dell'errore, che è il valore numerico della costante E_xxx dell'errore trovato. Avrai bisogno di scrivere codice personalizzato per catturare solo gli errori che vuoi.

Ad esempio, per catturare soloE_NOTICE errori, la funzione sarebbe simile a questa:

function my_error_handler($errno, $errstr, $errfile, $errline) { 
    if ($errno == E_NOTICE) { 
    // handle/log the error 
    } 
} 

set_error_handler("my_error_handler"); 
+0

Una risposta completa e ben costruita. Tuttavia, attivando display_errors vengono visualizzate le notifiche, non vengono registrate e il server esegue PHP 5.3.5, pertanto il problema E_DEPRECATED non è applicabile. Mi piacerebbe evitare di scrivere il mio gestore degli errori, ma non riesco a capire perché le notifiche verranno visualizzate, ma non registreranno! – chattsm

+0

@ m.p.c Non mi ero reso conto che questi errori si stavano verificando nel browser. Sembra che i livelli di 'error_reporting' siano soddisfacenti e che il suo stesso file di registro abbia un problema. Ho fatto un aggiornamento in cima alla mia risposta. – AgentConundrum

Problemi correlati