Jak uzyskać wyświetlanie błędów PHP?

1731

Sprawdziłem plik ini PHP ( php.ini) i display_errorsjest ustawiony, a także raportowanie błędów E_ALL. Uruchomiłem ponownie serwer Apache.

Umieściłem te wiersze na początku mojego skryptu i nawet nie wychwytuje prostych błędów analizy. Na przykład deklaruję zmienne za pomocą "$"a i nie zamykam instrukcji ";". Ale wszystkie moje skrypty pokazują pustą stronę na tych błędach, ale tak naprawdę chcę zobaczyć błędy w wynikach mojej przeglądarki.

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

Co pozostało do zrobienia?

Abs
źródło
8
Jeszcze nie ustaliłem dokładnie, dlaczego to działa czasami, a nie innych, ale dla każdego, kto chce szybko przełączać błędy w skrypcie php (lub włączyć je za pomocą $_REQUESTparametru), te dwa wiersze będą działać przez większość czasu.
brandonscript
możesz zobaczyć szczegóły błędu, włączając xdebug z pliku php ini.
jewelhuq
Oto krótki artykuł na ten temat - blog.phplogger.com/2019/03/10/error-message-visibility-in-php
Bogdans

Odpowiedzi:

3200

To zawsze działa dla mnie:

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

Jednak nie powoduje to, że PHP wyświetla błędy parsowania - jedynym sposobem pokazania tych błędów jest zmodyfikowanie pliku php.ini za pomocą tego wiersza:

display_errors = on

(jeśli nie masz dostępu php.ini, wstawienie tej linii .htaccessmoże również działać):

php_flag display_errors 1
Fantazyjny John
źródło
9
Zauważ też, że możesz użyć tych 3 wierszy, a następnie dołączyć ('fileImWorkingOn.php') ;. Wtedy możesz złapać również błędy składniowe!
Snap
14
Chociaż nie jestem SysOps, myślę, że więcej osób ma plik .htaccess niż php.ini, i oba one miałyby miejsce przed analizą, prawda? php_flag display_errors 1dla .htaccess
Ryan Taylor
1
Więc teraz, kiedy błędy są rejestrowane, dokąd one idą? Poszedłem do / var / log / apache2 i pokazuje wszystkie logi, ale nie ma żadnych informacji dotyczących programu, który ostatnio uruchomiłem. Informacje o ponownym uruchomieniu systemu otrzymuję tylko raz dziennie.
Michael
1
@Michael Błędy trafiają prosto na ekran lub do miejsca, w którym wyjście jest przekierowywane
Fancy John
2
E_ALLnie wystarcza do wyświetlenia wszystkich błędów w PHP 5.3. „ E_STRICTstał się częścią E_ALL5.4.0” - PHP Manual Potrzebujesz E_ALL | E_STRICTlub -1w tej wersji.
Gerard Roche
155

Nie można wyłapać błędów analizy podczas włączania wyjścia błędu w czasie wykonywania, ponieważ analizuje on plik przed faktycznym wykonaniem czegokolwiek (a ponieważ napotkał błąd podczas tego, nic nie wykona). Musisz zmienić faktyczną konfigurację serwera, aby włączone były parametry display_errors i używany był odpowiedni poziom zgłaszania błędów. Jeśli nie masz dostępu do php.ini, możesz być w stanie użyć .htaccess lub podobnego, w zależności od serwera.

To pytanie może zawierać dodatkowe informacje.

Michael Madsen
źródło
2
Nie wiedział tego. Plik php.ini poddałem edycji ręcznie i teraz działa. Dzięki!
Abs
143

Wewnątrz twojego php.ini :

display_errors = on

Następnie uruchom ponownie serwer WWW.

użytkownik1803477
źródło
7
+ ①. Na moim ubuntu /etc/php5/apache2/php.ini
m93a
5
do ponownego uruchomienia (Debian, Ubuntu itp.)sudo service apache2 restart
Peter Krauss
4
Restartu na OSX sudo apachectl -k restart.
Groch
3
fajny fakt: możesz znaleźć załadowany plik php.ini, jeśli po prostu wstawisz phpinfo (); do pustego pliku php. jest siódmy rząd w dół i nazywa sięLoaded Configuration File
Frankenmint
Jak możemy to zrobić, jeśli piszemy kod php bezpośrednio na cPanel?
arqam
98

Aby wyświetlić wszystkie błędy, musisz:

1. Niech te wiersze w skrypcie PHP, który wywołujesz z przeglądarki (zazwyczaj index.php):

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

2. (a) Upewnij się, że ten skrypt nie zawiera błędów składniowych

-lub-

2. (b) Ustaw display_errors = Onw swoimphp.ini

W przeciwnym razie nie może nawet uruchomić tych 2 linii!

Możesz sprawdzić błędy skryptu w skrypcie, uruchamiając (w wierszu poleceń):

php -l index.php

Jeśli to skrypt z innego skryptu PHP to będzie wyświetlać składniowe błędy w dołączonego skryptu. Na przykład:

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
Andre
źródło
51

Niektórzy dostawcy hostingu pozwalają na zmianę parametrów PHP w .htaccesspliku.

Możesz dodać następujący wiersz:

php_value display_errors 1

Miałem ten sam problem co twój i to rozwiązanie go rozwiązało.

Kalhua
źródło
A jeśli jesteś w środowisku nginx, dodaj wartość php do konfiguracji witryny (dostępne witryny) zgodnie z dyrektywą location ~ \ .php. fastcgi_param PHP_VALUE "raportowanie błędów = E_ALL; \ n display_errors = 1;";
Lazaros Kosmidis
40

Może się okazać, że wszystkie ustawienia „raportowania błędów” lub „błędów wyświetlania” nie działają w PHP 7. Jest tak, ponieważ zmieniła się obsługa błędów. Spróbuj zamiast tego:

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'];
}

Lub, aby wychwycić wyjątki i błędy za jednym razem (nie jest to wstecznie zgodne z 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'];
}
Frank Forte
źródło
1
Masz na myśli PHP7 lub PHP7.1? Jestem zdezorientowany, próbowałem jako zaproponowana poprawna odpowiedź i działa, myślę, że proponujesz coś nieco innego IMHO, w rzeczywistości „brak kompatybilności wstecznej” i jeśli musisz zmodyfikować pełny kod PHP <7 i musisz try{} catch() {}wszędzie dodawać kod w twoim już zdefiniowanym kodzie php, nie chcę nawet myśleć o bałaganie, który będzie ...
vdegenne
@FancyJohn, to może pomóc: $bt = debug_backtrace(); print_r($bt);.
Frank Forte
@ballangddang, natknąłem się na problem z PHP 7.0, gdzie jedynym sposobem, w jaki mogłem uzyskać błąd do wyświetlenia, było użycie bloków try / catch, a konkretnie łapanie Error. Jeśli przepiszesz wszystkie żądania (oprócz być może JavaScript, CSS, obrazy itp.) Do pliku index.php, możesz tam spróbować try catch catch, to ułatwia. Tak, każdy system, który nie ma pojedynczego punktu wejścia, wymagałby poważnych problemów z aktualizacją.
Frank Forte
Czy PHP nie pokazuje nieobsługiwanych wyjątków? Jesteś tego pewien?
Martin Tournoij,
Powinien pokazywać nieobsługiwane wyjątki. Jeśli włączysz bufor wyjściowy na początku (abyś mógł wysyłać nagłówki w dowolnym momencie przed ostatecznym opróżnieniem treści odpowiedzi), być może komunikat wyjątku gdzieś zginie.
Frank Forte,
33

To zadziała:

<?php
     error_reporting(E_ALL);
     ini_set('display_errors', 1);    
?>
Główny programista
źródło
33

Posługiwać się:

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

Jest to najlepszy sposób na napisanie go, ale błąd składniowy daje puste dane wyjściowe, więc użyj konsoli, aby sprawdzić błędy składniowe. Najlepszym sposobem debugowania kodu PHP jest użycie konsoli; uruchom następujące:

php -l phpfilename.php
Abhijit Jagtap
źródło
22

Ustaw to w pliku index.php :

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Sumit Gupta
źródło
20

Utwórz plik o nazwie php.ini w folderze, w którym znajduje się plik PHP.

Wewnątrz php.ini dodaj następujący kod (podam prosty błąd pokazujący kod):

display_errors = on

display_startup_errors = on
NavyaKumar
źródło
18

Oto skrypt 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 */
?>

Aby uzyskać bardziej szczegółowe wyjaśnienie błędów PHP, odwiedź PHP Error - error_reporting () .

B.Balamanigandan
źródło
2
Jak to się różni od Gustowna Jana odpowiedź ?
Wszyscy pracownicy są niezbędni
@cpburnz - To proste pytania, z których każdy ma ten sam zestaw kodów w smaku, co jedyna różnica. Podałem dodatkowy link URL, który da więcej informacji o błędzie PHP.
B.Balamanigandan
15

Jeśli pomimo wykonania wszystkich powyższych odpowiedzi (lub nie możesz edytować pliku php.ini) nadal nie możesz otrzymać komunikatu o błędzie, spróbuj utworzyć nowy plik PHP, który umożliwia zgłaszanie błędów, a następnie dołącz plik powodujący problem. na przykład:

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

Pomimo prawidłowego ustawienia wszystkiego w moim php.inipliku, był to jedyny sposób, w jaki mogłem złapać błąd przestrzeni nazw. Mój dokładny scenariusz to:

//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 {
    ...
}
jxmallett
źródło
1
Nie, raportowanie błędów to nie loglevel, to pole bitowe. Używanie 999999 to bardzo zły pomysł, użyj potęgi dwóch minus 1, na przykład 2047!
peterh - Przywróć Monikę
Masz absolutną rację, @peterh! Zmieniłem go na E_ALL, ponieważ umożliwi to raportowanie wszystkich błędów (z wyjątkiem ścisłych błędów w php 5.4 i niższych).
jxmallett
15

Zwykle korzystałem z następującego kodu w moich zwykłych projektach 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.');
    }
}
Channaveer Hakari
źródło
14

Jeśli w jakiś sposób znajdziesz się w sytuacji, w której nie możesz zmodyfikować ustawienia za pomocą php.inilub .htaccessnie masz szczęścia do wyświetlania błędów, gdy skrypty PHP zawierają błędy analizy. Następnie musisz rozwiązać problem z pobieraniem plików w wierszu polecenia w następujący sposób:

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

Jeśli twój host jest tak zablokowany, że nie pozwala na zmianę wartości za pomocą php.inilub .htaccess, może również uniemożliwić zmianę wartości za pomocą ini_set. Możesz to sprawdzić za pomocą następującego skryptu PHP:

<?php
if( !ini_set( 'display_errors', 1 ) ) {
  echo "display_errors cannot be set.";
} else {
  echo "changing display_errors via script is possible.";
}
Chiborg
źródło
find . -name '*.php' -type f -exec php -l {} \; | grep -v 'No syntax errors detected'jest prostsze
bułeczki
14

Ponieważ obecnie korzystamy z PHP 7, podane tutaj odpowiedzi nie są już poprawne. Jedynym nadal OK jest ten autorstwa Franka Forte'a , który mówi o PHP 7.

Z drugiej strony, zamiast próbować wychwytywać błędy za pomocą try / catch, możesz użyć triku: użyj include.

Oto trzy fragmenty kodu:

Plik: tst1.php

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

Uruchomienie tego w PHP 7 niczego nie pokaże.

Teraz spróbuj tego:

Plik: tst2.php

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

Plik: tst3.php

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

Teraz uruchom tst2, który ustawia raportowanie błędów, a następnie dołącz tst3. Zobaczysz:

Błąd analizy: błąd składni, nieoczekiwany koniec pliku, oczekiwanie zmiennej (T_VARIABLE) lub $ {(T_DOLLAR_OPEN_CURLY_BRACES) lub {$ (T_CURLY_OPEN) w tst3.php w linii 4

Piotr
źródło
13

Możesz zrobić coś takiego:

Ustaw poniższe parametry w głównym pliku indeksu:

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

Następnie na podstawie wymagań możesz wybrać, które chcesz pokazać:

W przypadku wszystkich błędów, ostrzeżeń i uwag:

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

Dla wszystkich błędów:

    error_reporting(E_ERROR);

W przypadku wszystkich ostrzeżeń:

    error_reporting(E_WARNING);

Dla wszystkich ogłoszeń:

    error_reporting(E_NOTICE);

Aby uzyskać więcej informacji, sprawdź tutaj .

Binit Ghetiya
źródło
Co to jest „główny plik indeksu” ? Plik index.html?
Peter Mortensen
12

Możesz dodać własną niestandardową procedurę obsługi błędów, która może dostarczyć dodatkowych informacji debugowania. Ponadto możesz skonfigurować przesyłanie informacji pocztą 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");
lintabá
źródło
7

Ten kod na górze powinien działać:

error_reporting(E_ALL);

Spróbuj jednak edytować kod w telefonie w pliku:

error_reporting =on
Wembo Mulumba
źródło
6

Najlepszym / łatwym / szybkim rozwiązaniem, którego można użyć w przypadku szybkiego debugowania, jest otoczenie kodu przechwytującymi wyjątkami. Właśnie to robię, gdy chcę szybko sprawdzić coś w produkcji.

try {
    // Page code
}
catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}
Xakiru
źródło
Dla php7 catch (Throwable $e)jest lepszy ... Lub kolejny blok catch pod spodemcatch(Error $e)
Frank Forte
4

Tylko napisz:

error_reporting(-1);
jewelhuq
źródło
4

Tego się nauczyłem. W pliku PHP.INI

error_reporting = E_ALL
display_errors = On
Salam
źródło
2
Zmieniasz się? Dodanie do?
Peter Mortensen
atm twoja odpowiedź nie ma sensu, ponieważ jej brak kontekstu; również określone przez Petera Mortensena. Brak poprawy przygotowuje go do „flagi do usunięcia” (przez boty). (Z przeglądu niskiej jakości).
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);
    ?>

Gdy Twoja witryna jest php.iniaktywna, ze względów bezpieczeństwa plik powinien mieć wyłączone parametry display_errors. Jednak w środowisku programistycznym display_errors można włączyć w celu rozwiązywania problemów.

przepraszam
źródło
4

Możesz to zrobić, zmieniając plik php.ini i dodając następujące elementy

display_errors = on
display_startup_errors = on

LUB możesz także użyć następującego kodu, ponieważ to zawsze działa dla mnie

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Muhammad Adeel Malik
źródło
3

Jeśli masz zainstalowany Xdebug , możesz zastąpić każde ustawienie, ustawiając:

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

force_display_errors

Wpisz: int, Wartość domyślna: 0, Wprowadzone w Xdebug> = 2.3 Jeśli to ustawienie jest ustawione na 1, błędy będą zawsze wyświetlane, bez względu na ustawienie PHP display_errors.

force_error_reporting

Typ: int, Wartość domyślna: 0, Wprowadzone w Xdebug> = 2.3 To ustawienie jest maską bitową, podobnie jak raportowanie błędów. Ta maska ​​bitowa będzie logicznie ORed z maską bitową reprezentowaną przez raportowanie błędów, aby określić, które błędy powinny być wyświetlane. To ustawienie można wprowadzić tylko w php.ini i pozwala wymusić wyświetlanie niektórych błędów bez względu na to, co aplikacja robi z ini_set ().

Peter Haberkorn
źródło
3

Możesz użyć tego kodu:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
baduker
źródło
2

Zgłoś wszystkie błędy oprócz E_NOTICE

error_reporting(E_ALL & ~E_NOTICE);

Wyświetl wszystkie błędy PHP

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

Wyłącz wszystkie raportowanie błędów

error_reporting(0);
Shaikh Nadeem
źródło
1

W Uniksowym interfejsie użytkownika bardzo praktyczne jest przekierowywanie tylko błędów do pliku :

./script 2> errors.log

Następnie z innej powłoki dla zmian na żywo:

tail -f errors.log

lub po prostu

watch cat errors.log
NVRM
źródło
Jak to odpowiada na pytanie dotyczące PHP?
Peter Mortensen
./scriptjest skryptem php CLI (hashbang #!/usr/bin/php). W ten sposób możesz przekierować błędy php w pliku. To jest potokowanie unix. To nie jest php jako CGI.
NVRM
0

Jeśli jest w linii poleceń, można uruchomić phpz -ddisplay_errors=1nadpisać ustawienie w php.ini:

php -ddisplay_errors=1 script.php
Gvlasov
źródło
-1

Inne niż php.inii ini_set()funkcje w skrypcie PHP, możesz zrobić to samo za pomocą .htaccessihttpd.conf dyrektyw pokazano poniżej.

Niektórzy dostawcy hostingu pozwalają na ustawienie ustawień PHP za pomocą .htaccessihttpd.conf .

Ukryj błędy 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

znalazłem tę odpowiedź, trochę googlując

mohitesachin217
źródło