Come posso visualizzare gli errori PHP?


1731

Ho controllato il mio file ini PHP ( php.ini) ed display_errorsè impostato e lo è anche la segnalazione degli erroriE_ALL . Ho riavviato il mio server web Apache.

Ho anche messo queste righe in cima alla mia sceneggiatura, e non rileva nemmeno semplici errori di analisi. Ad esempio, dichiaro variabili con a "$"e non chiudo le dichiarazioni ";". Ma tutti i miei script mostrano una pagina vuota su questi errori, ma voglio effettivamente vedere gli errori nell'output del mio browser.

error_reporting(E_ALL);
ini_set('display_errors', 1);

Cosa resta da fare?


8
Devo ancora definire con precisione il motivo per cui a volte funziona e non altri, ma per chiunque voglia commutare rapidamente errori in uno script php (o abilitarli tramite un $_REQUESTparametro) queste due righe funzioneranno la maggior parte del tempo.
brandonscript,

bene puoi vedere i dettagli dell'errore abilitando xdebug dal file ini php.
Jewelhuq,

Ecco un breve articolo che tratta l'argomento - blog.phplogger.com/2019/03/10/error-message-visibility-in-php
Bogdans

Risposte:


3200

Questo funziona sempre per me:

ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);

Tuttavia, ciò non fa in modo che PHP mostri errori di analisi - l'unico modo per mostrare tali errori è modificare php.ini con questa riga:

display_errors = on

(se non hai accesso a php.ini, inserire anche questa linea .htaccesspotrebbe funzionare):

php_flag display_errors 1

9
Si noti inoltre che è possibile utilizzare queste 3 righe e quindi includere ('fileImWorkingOn.php') ;. Quindi puoi anche prendere gli errori di sintassi!
Scatta

14
Anche se non sono SysOps, penso che più persone abbiano un file .htaccess di php.ini, e questi verrebbero entrambi prima dell'analisi, giusto? php_flag display_errors 1per .htaccess
Ryan Taylor,

1
Quindi ora che gli errori vengono registrati, dove vanno? Sono andato su / var / log / apache2 e mostra tutti i registri, ma non ci sono informazioni sul programma che ho eseguito di recente. Ricevo informazioni sul riavvio del sistema solo una volta ogni mattina.
Michael,

1
@Michael Gli errori vanno direttamente allo schermo o al punto in cui viene reindirizzato l'output
Fancy John,

2
E_ALLnon è sufficiente per visualizzare tutti gli errori in PHP 5.3. " E_STRICTdiventato parte di E_ALLin 5.4.0" - Manuale PHP È necessario E_ALL | E_STRICTo -1in quella versione.
Gerard Roche,

155

Non è possibile rilevare errori di analisi quando si abilita l'output dell'errore in fase di esecuzione, poiché analizza il file prima di eseguire effettivamente qualsiasi cosa (e poiché si verifica un errore durante questo, non eseguirà nulla). Dovrai modificare la configurazione effettiva del server in modo che display_errors sia attivo e venga utilizzato il livello di segnalazione errori apprendista. Se non hai accesso a php.ini, potresti essere in grado di usare .htaccess o simili, a seconda del server.

Questa domanda può fornire ulteriori informazioni.


2
Non lo sapevo. Ho modificato manualmente il file php.ini e ora funziona. Grazie!
Abs,

143

All'interno del tuo php.ini :

display_errors = on

Quindi riavviare il server Web.


7
+ ①. Sul mio ubuntu /etc/php5/apache2/php.ini
m93a

5
per il riavvio (Debian, Ubuntu, ecc.)sudo service apache2 restart
Peter Krauss,

4
Per riavviare su OS X sudo apachectl -k restart.
Pea

3
fatto curioso: è possibile individuare il file php.ini caricato se si inserisce semplicemente phpinfo (); in un file php vuoto. è la settima fila e chiamaLoaded Configuration File
Frankenmint il

Come possiamo fare se scriviamo il codice php direttamente su cPanel?
Arqam,

98

Per visualizzare tutti gli errori è necessario:

1. Inserisci queste righe nello script PHP che stai chiamando dal browser (in genere index.php):

error_reporting(E_ALL);
ini_set('display_errors', '1');

2. (a) Assicurarsi che questo script non contenga errori di sintassi

-o-

2. (b) Impostare display_errors = Oninphp.ini

Altrimenti, non può nemmeno eseguire quelle 2 linee!

Puoi verificare la presenza di errori di sintassi nello script eseguendo (dalla riga di comando):

php -l index.php

Se includi lo script da un altro script PHP, verranno visualizzati errori di sintassi nello script incluso . Per esempio:

index.php

error_reporting(E_ALL);
ini_set('display_errors', '1');

// Any syntax errors here will result in a blank screen in the browser

include 'my_script.php';

my_script.php

adjfkj // This syntax error will be displayed in the browser

51

Alcuni provider di web hosting consentono di modificare i parametri PHP in .htaccess file.

È possibile aggiungere la seguente riga:

php_value display_errors 1

Ho avuto lo stesso problema del tuo e questa soluzione l'ha risolto.


E se ti trovi in ​​un ambiente nginx, aggiungi il valore php alla configurazione del tuo sito (siti disponibili) sotto la direttiva location ~ \ .php. fastcgi_param PHP_VALUE "error_reporting = E_ALL; \ n display_errors = 1;";
Lazaros Kosmidis,

40

Potresti trovare che tutte le impostazioni per "segnalazione errori" o "errori di visualizzazione" non funzionano in PHP 7. Questo perché la gestione degli errori è cambiata. Prova questo invece:

try{
     // Your code
} 
catch(Error $e) {
    $trace = $e->getTrace();
    echo $e->getMessage().' in '.$e->getFile().' on line '.$e->getLine().' called from '.$trace[0]['file'].' on line '.$trace[0]['line'];
}

Oppure, per catturare eccezioni ed errori in una volta (questo non è retrocompatibile con PHP 5):

try{
     // Your code
} 
catch(Throwable $e) {
    $trace = $e->getTrace();
    echo $e->getMessage().' in '.$e->getFile().' on line '.$e->getLine().' called from '.$trace[0]['file'].' on line '.$trace[0]['line'];
}

1
Intendi PHP7 o PHP7.1? Sono confuso, ho provato come proposta di risposta convalidata e funziona, penso che stai proponendo qualcosa di un po 'diverso IMHO, anzi "nessuna retrocompatibilità" e se devi modificare un codice PHP <7 completo e devi aggiungere try{} catch() {}codice ovunque nel tuo codice php già definito, non voglio nemmeno pensare al casino che sarà ...
vdegenne,

@FancyJohn, questo potrebbe aiutare: $bt = debug_backtrace(); print_r($bt);.
Frank Forte,

@ballangddang, ho riscontrato il problema con PHP 7.0, in cui l'unico modo per visualizzare l'errore era utilizzare i blocchi try / catch e in modo specifico catching Error. Se riscrivi tutte le richieste (eccetto forse JavaScript, CSS, Immagini, ecc.) Nel file index.php, quindi hai il blocco catch catch lì, lo rende più facile. Sì, qualsiasi sistema che non ha un singolo punto di ingresso sarebbe un grosso problema da aggiornare.
Frank Forte,

PHP non mostra eccezioni non gestite? Abbastanza sicuro che lo fa?
Martin Tournoij,

Dovrebbe mostrare eccezioni non gestite. Se si attiva un buffer di output all'avvio (in modo da poter inviare le intestazioni in qualsiasi momento prima di scaricare definitivamente il corpo della risposta), forse il messaggio di eccezione può andare perso da qualche parte.
Frank Forte,


33

Uso:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

Questo è il modo migliore per scriverlo, ma un errore di sintassi fornisce un output vuoto, quindi usa la console per verificare la presenza di errori di sintassi. Il modo migliore per eseguire il debug del codice PHP è utilizzare la console; eseguire quanto segue:

php -l phpfilename.php

22

Impostalo nel tuo file index.php :

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

20

Crea un file chiamato php.ini nella cartella in cui risiede il tuo file PHP.

All'interno di php.ini aggiungi il seguente codice (sto dando un semplice errore che mostra il codice):

display_errors = on

display_startup_errors = on

18

Ecco uno script PHP:

<?php
    ini_set("display_startup_errors", 1);
    ini_set("display_errors", 1);

    /* Reports for either E_ERROR | E_WARNING | E_NOTICE  | Any Error*/
    error_reporting(E_ALL);

    echo(abc); /* Notice: abc is an undefined constant */
?>

Per una spiegazione più dettagliata degli errori PHP, visitare Errore PHP - error_reporting () .


2
In che modo differisce dalla risposta di Fancy John ?
Tutti i lavoratori sono essenziali

@cpburnz - È una domanda semplice, ognuno con la stessa serie di codici nel proprio sapore che l'unica differenza. Ho aggiunto un link URL che fornirà ulteriori informazioni sull'errore PHP.
B. Balamanigandan,

15

Se, nonostante segui tutte le risposte di cui sopra (o non riesci a modificare il tuo file php.ini), non riesci ancora a ricevere un messaggio di errore, prova a creare un nuovo file PHP che abiliti la segnalazione degli errori e includi quindi il file del problema. per esempio:

error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once('problem_file.php');

Pur avendo tutto impostato correttamente nel mio php.inifile, questo è stato l'unico modo in cui ho potuto rilevare un errore dello spazio dei nomi. Il mio scenario esatto era:

//file1.php
namespace a\b;
class x {
    ...
}

//file2.php
namespace c\d;
use c\d\x; //Dies because it's not sure which 'x' class to use
class x {
    ...
}

1
No, la segnalazione degli errori non è un livello Google, è un campo di bit. Usare 999999 è una pessima idea, usa un po 'di potenza di due meno 1, ad esempio 2047!
Peter - Ripristina Monica il

Hai assolutamente ragione, @peterh! L'ho cambiato in E_ALL in quanto ciò consentirà la segnalazione di tutti gli errori (tranne gli errori rigorosi in php 5.4 e precedenti).
jxmallett,

15

Di solito andrei con il seguente codice nei miei semplici progetti PHP.

if(!defined('ENVIRONMENT')){
    define('ENVIRONMENT', 'DEVELOPMENT');
}

$base_url = null;

if (defined('ENVIRONMENT'))
{
    switch (ENVIRONMENT)
    {
        case 'DEVELOPMENT':
            $base_url = 'http://localhost/product/';
            ini_set('display_errors', 1);
            ini_set('display_startup_errors', 1);
            error_reporting(E_ALL|E_STRICT);
            break;

        case 'PRODUCTION':
            $base_url = 'Production URL'; /* https://google.com */
            error_reporting(0);
            /* Mechanism to log errors */
            break;

        default:
            exit('The application environment is not set correctly.');
    }
}


14

Se in qualche modo ti trovi in ​​una situazione in cui non puoi modificare l'impostazione tramite php.inio .htaccesssei sfortunato per la visualizzazione di errori quando i tuoi script PHP contengono errori di analisi. Dovresti quindi risolvere per sfilacciare i file dalla riga di comando in questo modo:

find . -name '*.php' -type f -print0 | xargs -0 -n1 -P8 php -l | grep -v "No syntax errors"

Se il tuo host è così bloccato da non consentire la modifica del valore tramite php.inio .htaccess, può anche impedire la modifica del valore tramite ini_set. Puoi verificarlo con il seguente script PHP:

<?php
if( !ini_set( 'display_errors', 1 ) ) {
  echo "display_errors cannot be set.";
} else {
  echo "changing display_errors via script is possible.";
}

find . -name '*.php' -type f -exec php -l {} \; | grep -v 'No syntax errors detected'è più semplice
focaccine

14

Poiché ora stiamo eseguendo PHP 7, le risposte fornite qui non sono più corrette. L'unico ancora OK è quello di Frank Forte , mentre parla di PHP 7.

Dall'altro lato, invece di provare a rilevare errori con un tentativo / cattura puoi usare un trucco: usa include.

Ecco tre pezzi di codice:

File: tst1.php

<?php
    error_reporting(E_ALL);
    ini_set('display_errors', 'On');
    // Missing " and ;
    echo "Testing
?>

Eseguirlo in PHP 7 non mostrerà nulla.

Ora prova questo:

File: tst2.php

<?php
    error_reporting(E_ALL);
    ini_set('display_errors', 'On');
    include ("tst3.php");
?>

File: tst3.php

<?php
    // Missing " and ;
    echo "Testing
?>

Ora esegui tst2 che imposta la segnalazione degli errori, quindi includi tst3. Vedrai:

Errore di analisi: errore di sintassi, fine imprevista del file, previsione variabile (T_VARIABLE) o $ {(T_DOLLAR_OPEN_CURLY_BRACES) o {$ (T_CURLY_OPEN) in tst3.php sulla riga 4


13

Puoi fare qualcosa come di seguito:

Impostare i parametri seguenti nel file di indice principale:

    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);

Quindi in base alle tue esigenze puoi scegliere quale vuoi mostrare:

Per tutti gli errori, avvertenze e avvisi:

    error_reporting(E_ALL); OR error_reporting(-1);

Per tutti gli errori:

    error_reporting(E_ERROR);

Per tutti gli avvisi:

    error_reporting(E_WARNING);

Per tutti gli avvisi:

    error_reporting(E_NOTICE);

Per maggiori informazioni, controlla qui .


Che cos'è il "file indice principale" ? File index.html?
Peter Mortensen,

12

È possibile aggiungere il proprio gestore di errori personalizzato, che può fornire ulteriori informazioni di debug. Inoltre, puoi configurarlo per inviarti le informazioni via e-mail.

function ERR_HANDLER($errno, $errstr, $errfile, $errline){
    $msg = "<b>Something bad happened.</b> [$errno] $errstr <br><br>
    <b>File:</b> $errfile <br>
    <b>Line:</b> $errline <br>
    <pre>".json_encode(debug_backtrace(), JSON_PRETTY_PRINT)."</pre> <br>";

    echo $msg;

    return false;
}

function EXC_HANDLER($exception){
    ERR_HANDLER(0, $exception->getMessage(), $exception->getFile(), $exception->getLine());
}

function shutDownFunction() {
    $error = error_get_last();
    if ($error["type"] == 1) {
        ERR_HANDLER($error["type"], $error["message"], $error["file"], $error["line"]);
    }
}

set_error_handler ("ERR_HANDLER", E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
register_shutdown_function("shutdownFunction");
set_exception_handler("EXC_HANDLER");

7

Questo codice in alto dovrebbe funzionare:

error_reporting(E_ALL);

Tuttavia, prova a modificare il codice sul telefono nel file:

error_reporting =on

6

La soluzione migliore / facile / veloce che puoi usare se si tratta di un debug rapido, è di circondare il tuo codice con eccezioni accattivanti. Questo è quello che sto facendo quando voglio controllare qualcosa velocemente nella produzione.

try {
    // Page code
}
catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

Per php7, catch (Throwable $e)è meglio ... O un altro blocco di cattura sottocatch(Error $e)
Frank Forte


4

Questo è quello che ho imparato. Nel file PHP.INI,

error_reporting = E_ALL
display_errors = On

2
Stai cambiando? Aggiungere a?
Peter Mortensen,

la tua risposta non ha senso perché non ha un contesto; stipulato anche da Peter Mortensen. Non migliorandolo si prepara per "flag per la rimozione" (dai bot). (Dalla recensione di bassa qualità).
ZF007,

4
    <?php
    // Turn off error reporting
    error_reporting(0);

    // Report runtime errors
    error_reporting(E_ERROR | E_WARNING | E_PARSE);

    // Report all errors
    error_reporting(E_ALL);

    // Same as error_reporting(E_ALL);
    ini_set("error_reporting", E_ALL);

    // Report all errors except E_NOTICE
    error_reporting(E_ALL & ~E_NOTICE);
    ?>

Mentre il tuo sito è php.iniattivo , il file dovrebbe avere display_errors disabilitato per motivi di sicurezza. Tuttavia, per l'ambiente di sviluppo, display_errors può essere abilitato per la risoluzione dei problemi.


4

È possibile farlo modificando il file php.ini e aggiungere quanto segue

display_errors = on
display_startup_errors = on

O puoi anche usare il seguente codice in quanto questo funziona sempre per me

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

3

Se hai installato Xdebug puoi ignorare tutte le impostazioni impostando:

xdebug.force_display_errors = 1;
xdebug.force_error_reporting = -1;

force_display_errors

Tipo: int, Valore predefinito: 0, Introdotto in Xdebug> = 2.3 Se questa impostazione è impostata su 1, gli errori verranno sempre visualizzati, indipendentemente dall'impostazione di display_errors di PHP.

force_error_reporting

Tipo: int, Valore predefinito: 0, Introdotto in Xdebug> = 2.3 Questa impostazione è una maschera di bit, come error_reporting. Questa maschera di bit verrà logicamente ORed con la maschera di bit rappresentata da error_reporting per determinare quali errori devono essere visualizzati. Questa impostazione può essere effettuata solo in php.ini e consente di forzare la visualizzazione di alcuni errori, indipendentemente da ciò che un'applicazione fa con ini_set ().


3

Potresti voler usare questo codice:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

2

Segnala tutti gli errori tranne E_NOTICE

error_reporting(E_ALL & ~E_NOTICE);

Mostra tutti gli errori PHP

error_reporting(E_ALL);  or ini_set('error_reporting', E_ALL);

Disattiva tutti i rapporti sugli errori

error_reporting(0);

1

In Unix CLI , è molto pratico reindirizzare solo gli errori su un file :

./script 2> errors.log

Quindi da un'altra shell, per modifiche live:

tail -f errors.log

o semplicemente

watch cat errors.log

Come risponde a questa domanda su PHP?
Peter Mortensen,

./scriptè uno script CLI php (hashbang #!/usr/bin/php). In questo modo puoi reindirizzare gli errori php in un file. Questa è una tubazione unix. Questo non è php come CGI.
NVRM il

0

Se si trova sulla riga di comando, è possibile eseguire phpcon -ddisplay_errors=1per ignorare l'impostazione in php.ini:

php -ddisplay_errors=1 script.php

-1

Oltre alle funzioni php.inie ini_set()in uno script PHP, puoi fare la stessa cosa con .htaccesse le httpd.confdirettive mostrate di seguito.

Alcuni provider di hosting consentono di impostare PHP tramite .htaccessehttpd.conf .

Nascondi errori PHP

php_flag display_startup_errors ON

php_flag display_errors ON

php_flag html_errors ON

php_flag log_errors on

php_flag ignore_repeated_errors off

php_flag ignore_repeated_source off

php_flag report_memleaks on

php_flag track_errors on

php_value docref_root 0

php_value docref_ext 0

php_value error_log /home/path/public_html/domain/PHP_errors.log

php_value error_reporting 999999999

php_value error_reporting -1

php_value log_errors_max_len 0

Order allow,deny

Deny from all

Satisfy All

ho trovato questa risposta cercandomi su Google

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.