Jak mogę uzyskać przydatne komunikaty o błędach w PHP?

583

Dość często spróbuję uruchomić skrypt PHP i odzyskać pusty ekran. Brak komunikatu o błędzie; tylko pusty ekran. Przyczyną może być prosty błąd składniowy (zły nawias, brak średnika), nieudane wywołanie funkcji lub coś zupełnie innego.

Bardzo trudno jest ustalić, co poszło nie tak. W końcu komentuję kod, wszędzie wpisuję „echo” itp., Próbując zawęzić problem. Ale na pewno musi być lepszy sposób, prawda?

Czy istnieje sposób, aby PHP wygenerował przydatny komunikat o błędzie, tak jak Java?

Candidasa
źródło
2
Zobacz także stackoverflow.com/q/1475297/632951
Pacerier
4
@JuannStrauss, To zaniżone. A kiedy w końcu zobaczysz błędy, mówi T_PAAMAYIM_NEKUDOTAYIM. A może „musi być wystąpieniem liczby całkowitej, podanej liczby całkowitej” .
Pacerier,
1
Samouczek na ten temat: code2real.blogspot.com/2015/06/…
Uczeń

Odpowiedzi:

498

W przypadku błędów składniowych musisz włączyć wyświetlanie błędów w pliku php.ini. Domyślnie są one wyłączone, ponieważ nie chcesz, aby „klient” widział komunikaty o błędach. Sprawdź tę stronę w dokumentacji PHP, aby uzyskać informacje na temat 2 dyrektyw: error_reportingi display_errors. display_errorsjest prawdopodobnie tym, który chcesz zmienić. Jeśli nie możesz zmodyfikować pliku php.ini, możesz również dodać następujące wiersze do pliku .htaccess:

php_flag  display_errors        on
php_value error_reporting       2039

Możesz rozważyć użycie wartości E_ALL (jak wspomniano w Gumbo) dla swojej wersji PHP, error_reportingaby uzyskać wszystkie błędy. więcej informacji

3 inne elementy: (1) Możesz sprawdzić plik dziennika błędów, ponieważ zawiera on wszystkie błędy (chyba że rejestrowanie zostało wyłączone). (2) Dodanie następujących 2 wierszy pomoże ci debugować błędy, które nie są błędami składniowymi:

error_reporting(-1);
ini_set('display_errors', 'On');

(3) Inną opcją jest użycie edytora, który sprawdza błędy podczas pisania, takiego jak PhpEd . PhpEd zawiera także debugger, który może dostarczyć bardziej szczegółowych informacji. (Debuger PhpEd jest bardzo podobny do xdebug i integruje się bezpośrednio z edytorem, więc używasz 1 programu do robienia wszystkiego.)

Link Cartmana jest również bardzo dobry: http://www.ibm.com/developerworks/library/os-debug/

Darryl Hein
źródło
25
2039 jest wartością E_ERROR | E_WARNING | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE. Zobacz docs.php.net/manual/en/errorfunc.constants.php
Gumbo
Podoba mi się opcja pliku .htaccess. Pomaga mi debugować w obszarze, który nie jest częścią publicznej strony internetowej. Wielkie dzięki za tę wskazówkę!
jacekn
1
Dodałbym, że błędy logowania do pliku (i szukanie ich tam) są najlepszym rozwiązaniem. Nie polegaj na wyświetlaniu błędów na stronie - mogą to zepsuć, możesz zapomnieć o włączeniu raportowania błędów dla witryny produkcyjnej, a to spowoduje problemy w przyszłości
Ivan Yarych
455

Następujące włącza wszystkie błędy:

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

Zobacz także następujące linki

Eljakim
źródło
28
Najlepiej wprowadzić te zmiany na poziomie pliku .ini. Włączanie raportowania błędów w skrypcie jest bezużyteczne, ponieważ nie pomoże w przypadku błędów składniowych lub innych błędów krytycznych, które zabijają fazę kompilacji. Skrypt zostaje zabity na długo zanim zacznie się uruchamiać i osiągnie zastąpienie raportowania.
Marc B
Naprawdę masz rację. Nie zauważyłem, że przeniesienie jest na twój własny serwer.
Eljakim
6
Uruchom phpinfo (), aby znaleźć poprawny plik php.ini. Poszukaj linii załadowanego pliku konfiguracyjnego .
boricious
1
Jeśli szukasz błędów, które występują podczas fazy kompilacji, sprawdź swoje dzienniki Apache często znajdujące się pod adresem /var/log/apache2/error.log
csi
1
Ta odpowiedź nie powiedzie się na php7, gdy włączone jest ścisłe pisanie, ponieważ drugim parametrem ini_setjest łańcuch.
PeeHaa,
175

Poniższy kod powinien wyświetlać wszystkie błędy:

<?php

// ----------------------------------------------------------------------------------------------------
// - Display Errors
// ----------------------------------------------------------------------------------------------------
ini_set('display_errors', 'On');
ini_set('html_errors', 0);

// ----------------------------------------------------------------------------------------------------
// - Error Reporting
// ----------------------------------------------------------------------------------------------------
error_reporting(-1);

// ----------------------------------------------------------------------------------------------------
// - Shutdown Handler
// ----------------------------------------------------------------------------------------------------
function ShutdownHandler()
{
    if(@is_array($error = @error_get_last()))
    {
        return(@call_user_func_array('ErrorHandler', $error));
    };

    return(TRUE);
};

register_shutdown_function('ShutdownHandler');

// ----------------------------------------------------------------------------------------------------
// - Error Handler
// ----------------------------------------------------------------------------------------------------
function ErrorHandler($type, $message, $file, $line)
{
    $_ERRORS = Array(
        0x0001 => 'E_ERROR',
        0x0002 => 'E_WARNING',
        0x0004 => 'E_PARSE',
        0x0008 => 'E_NOTICE',
        0x0010 => 'E_CORE_ERROR',
        0x0020 => 'E_CORE_WARNING',
        0x0040 => 'E_COMPILE_ERROR',
        0x0080 => 'E_COMPILE_WARNING',
        0x0100 => 'E_USER_ERROR',
        0x0200 => 'E_USER_WARNING',
        0x0400 => 'E_USER_NOTICE',
        0x0800 => 'E_STRICT',
        0x1000 => 'E_RECOVERABLE_ERROR',
        0x2000 => 'E_DEPRECATED',
        0x4000 => 'E_USER_DEPRECATED'
    );

    if(!@is_string($name = @array_search($type, @array_flip($_ERRORS))))
    {
        $name = 'E_UNKNOWN';
    };

    return(print(@sprintf("%s Error in file \xBB%s\xAB at line %d: %s\n", $name, @basename($file), $line, $message)));
};

$old_error_handler = set_error_handler("ErrorHandler");

// other php code

?>

Jedynym sposobem na wygenerowanie pustej strony z tym kodem jest błąd w module obsługi zamykania. Skopiowałem i wkleiłem to z własnego cms bez testowania, ale jestem pewien, że to działa.

m4dm4x1337
źródło
4
Otrzymuję pustą stronę z tego kodu. Co rozumiesz przez „masz błąd w module obsługi zamykania” i co powinienem zrobić, aby rozwiązać problem?
Paolo M
@PaoloM, mówi błąd w ShutdownHandlerpowyższej funkcji . Zasadniczo jest to hack stopgap zamiast prawidłowej obsługi błędów.
Pacerier
Dzięki, było przydatne, ale jak mogę wyłączyć E_NOTICEbłędy w tej funkcji?
MajAfy,
To właściwe rozwiązanie, ale należy zachować ostrożność przy ujawnianiu informacji, gdy wystąpi błąd ... (wolę rejestrowanie zamiast echa dla użytkowników)
Sam Jason Braddock
1
Używam tego, gdy Symfony nie może poprawnie wykryć krytycznych błędów.
Cewka
61

Błędy i ostrzeżenia zwykle pojawiają się w ustawieniach php.ini ....\logs\php_error.loglub w ....\logs\apache_error.logzależności od nich.

Przydatne błędy są często kierowane do przeglądarki, ale ponieważ nie są poprawnymi plikami HTML, nie są wyświetlane.

Więc "tail -f„pliki dziennika i gdy pojawi się pusty ekran, użyj opcji menu„ Widok ”->„ Źródło ”przeglądarki IE, aby wyświetlić nieprzetworzone dane wyjściowe.

James Anderson
źródło
13
Niestety, widok źródła strony nie wyświetla również niczego.
Matthew Scharley,
2
Błędy analizy powinny być widoczne w dzienniku błędów Apache, niezależnie od tego, jakie ustawienie masz gdzie indziej. Jeśli nie masz kontroli nad serwerem, uzyskanie dziennika błędów apache może być trudne, ale radzę porozmawiać z dostawcą i istnieją sposoby na ujawnienie dziennika błędów. Poza tym mogę jedynie zasugerować, co jeszcze mają - sprawdź kod pod kątem błędów parsowania na lokalnym serwerze programistycznym przed wdrożeniem do wersji produkcyjnej. Bardzo pomocne może być sprawdzanie IDE, takie jak PDT Eclipse.
Guss
5
Wracając do tego, ostatnio miałem problem z przepełnieniem stosu, który nie generował żadnych błędów, nawet w logach i nie pojawiał się jako taki, dopóki nie zainstalowałem xdebug na serwerze. Gah
Matthew Scharley
Jeśli nie możesz zmodyfikować pliku php.ini, utwórz w nim plik .htaccess php_flag display_errors 1.
Tom
59

Do pliku, który chcesz debugować, możesz dołączyć następujące wiersze:

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

To zastępuje ustawienia domyślne w php.ini, które powodują, że PHP zgłasza błędy do dziennika.

Tomalak
źródło
2
To prawda. W takim przypadku wartości muszą być ustawione bezpośrednio w ini - dla czystego środowiska programistycznego i tak może być preferowane.
Tomalak
53

Konfiguracja PHP

2 wpisy w php.ini dyktują wyjście błędów:

  1. display_errors
  2. error_reporting

W produkcji , display_errorsjest zwykle ustawiony naOff (co jest dobrą rzeczą, ponieważ wyświetlacz błąd w zakładach produkcyjnych na ogół nie jest wskazane!).

Jednak w fazie rozwoju należy go ustawić Ontak, aby wyświetlały się błędy. Sprawdź !

error_reporting(od PHP 5.3) jest domyślnie ustawiony na E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED(co oznacza, że ​​wszystko jest wyświetlane z wyjątkiem powiadomień, ścisłych standardów i powiadomień o wycofaniu). W razie wątpliwości należy ustawić E_ALLwyświetlanie wszystkich błędów. Czek !

Whoa whoa! Bez czeku! Nie mogę zmienić mojego php.ini!

Jaka szkoda. Zwykle hosty współdzielone nie pozwalają na modyfikację pliku php.ini, więc ta opcja jest niestety niedostępna. Ale nie bój się! Mamy inne opcje !

Konfiguracja środowiska wykonawczego

W pożądanym skrypcie możemy zmieniać wpisy php.ini w czasie wykonywania! Oznacza to, że uruchomi się po uruchomieniu skryptu! Słodkie!

error_reporting(E_ALL);
ini_set("display_errors", "On");

Te dwie linie będą miały taki sam efekt jak zmiana wpisów php.ini jak wyżej! Niesamowite!

Nadal pojawia się błąd pustej strony / 500!

Oznacza to, że skrypt nawet się nie uruchomił! Zwykle dzieje się tak, gdy masz błąd składniowy!

Przy błędach składniowych skrypt nawet nie uruchamia się. Nie powiedzie się w czasie kompilacji , co oznacza, że ​​użyje wartości z php.ini, które, jeśli nie zostały zmienione, mogą nie pozwolić na wyświetlanie błędów.

Dzienniki błędów

Ponadto PHP domyślnie rejestruje błędy. W hostingu współdzielonym może znajdować się w dedykowanym folderze lub w tym samym folderze, co skrytyk.

Jeśli masz dostęp do php.ini, możesz go znaleźć pod error_logwpisem.

Duch Madary
źródło
30

Istnieje naprawdę przydatne rozszerzenie o nazwie „ xdebug ”, które sprawi, że twoje raporty również będą ładniejsze.

gnarf
źródło
2
Rzeczywiście, jest to bardzo przydatne narzędzie do debugowania - sprawia, że ​​komunikaty o błędach są bardziej szczegółowe, z pełnymi śladami stosu i zmiennymi zrzutami i wszystkim.
Hbw
2
Tak. A następnie użyj czegoś takiego jak wtyczka VimDebugger, aby przejść przez kod i dowiedzieć się, gdzie idzie źle.
Sander Marechal
1
NetBeans z xdebug tutaj. To takie niesamowite. Jestem nowy w PHP (zwykle ASP.NET) i wcześniej wydawałem instrukcje echa.
Some Canuck
30

Zawsze używam tej składni na samym początku skryptu php.

ini_set('error_reporting', E_ALL);
ini_set('display_errors', 'On');  //On or Off
FDisk
źródło
3
Przykro mi, ale -1 za brak czytania innych odpowiedzi już opublikowanych. Zostało to rozwiązane w .htaccess, jak już wspomniano kilka razy.
Matthew Scharley,
12
„darmowy hosting” zwykle ignoruje .htaccess
FDisk,
27

W celu szybkiego, praktycznego rozwiązywania problemów zwykle sugeruję tutaj w SO:

error_reporting(~0); ini_set('display_errors', 1);

do umieszczenia na początku skryptu, który jest w trakcie rozwiązywania problemów. To nie jest idealne, idealnym wariantem jest to, że włączasz to również php.inii logujesz błędy w PHP, aby wychwycić błędy składniowe i startowe.

Przedstawione tutaj ustawienia wyświetlają wszystkie błędy, powiadomienia i ostrzeżenia, w tym ścisłe, niezależnie od wersji PHP.

Następujące rzeczy do rozważenia:

  • Zainstaluj Xdebug i włącz zdalne debugowanie za pomocą IDE.

Zobacz także:

hakre
źródło
27

Możliwe jest zarejestrowanie haka, aby widoczny był ostatni błąd lub ostrzeżenie.

function shutdown(){
  var_dump(error_get_last());
}

register_shutdown_function('shutdown');

dodanie tego kodu na początku twojego index.php pomoże ci w debugowaniu problemów.

Eduardo Oliveira
źródło
1
To czyste złoto dla ludzi, którzy utknęli w hostach internetowych, które nie pokazują błędów, ale umożliwiają zerowy dostęp do dziennika
Rafael Mena Barreto
18

Jest to problem z konfiguracją ładowania vs. środowiska wykonawczego

Ważne jest, aby zdawać sobie sprawę z tego, że podczas kroku kompilacji lub analizy występuje błąd składniowy lub błąd analizy , co oznacza, że ​​PHP zostanie zwolnione za kaucją, zanim nawet będzie w stanie wykonać dowolny kod. Więc jeśli modyfikujesz display_errorskonfigurację PHP w czasie wykonywania (obejmuje to wszystko od użycia ini_setw kodzie do użycia .htaccess, który jest plikiem konfiguracyjnym środowiska wykonawczego), wówczas tylko domyślnie załadowane ustawienia konfiguracji odtwarzane są .

Jak zawsze unikać WSOD podczas programowania

Aby uniknąć WSOD, musisz upewnić się, że załadowany plik konfiguracyjny jest display_errorswłączony i error_reportingustawiony na -1( jest to równoważny E_ALL, ponieważ zapewnia, że ​​wszystkie bity są włączone niezależnie od wersji PHP, którą używasz ). Nie koduj na stałe stałej wartości E_ALL, ponieważ ta wartość może ulec zmianie między różnymi wersjami PHP.

Załadowany konfiguracja jest albo Twój załadowany php.iniplik lub Twój apache.conflub httpd.conflub virtualhost plików. Pliki te są odczytywane tylko raz na etapie uruchamiania (na przykład po raz pierwszy uruchamiają apache httpd lub php-fpm) i są zastępowane tylko przez zmiany konfiguracji środowiska wykonawczego. Upewniając się, że display_errors = 1i error_reporting = -1w twoich załadowanych plików konfiguracji, zapewnia, że nigdy nie będzie widać WSOD niezależnie od składni lub przeanalizowania błędów, które występują przed zmianą wykonawczego podobnego ini_set('display_errors', 1);lub error_reporting(E_ALL);może nastąpić.

Jak znaleźć załadowane (php.ini) pliki konfiguracyjne

Aby zlokalizować załadowane pliki konfiguracyjne, po prostu utwórz nowy plik PHP zawierający tylko następujący kod ...

<?php
phpinfo();

Następnie skieruj tam przeglądarkę i spójrz na załadowany plik konfiguracyjny i przeanalizowane dodatkowe pliki .ini , które zwykle znajdują się na górze plikuphpinfo() i będą zawierać bezwzględną ścieżkę do wszystkich załadowanych plików konfiguracyjnych.

Jeśli widzisz (none)zamiast pliku, oznacza to, że nie masz pliku php.ini w ścieżce pliku konfiguracyjnego (php.ini) . Aby pobrać stąd plik php.ini dołączony do PHP i skopiować go do ścieżki pliku konfiguracyjnego jako php.ini, a następnie upewnij się, że użytkownik php ma wystarczające uprawnienia do odczytu z tego pliku. Aby go załadować, musisz zrestartować httpd lub php-fpm. Pamiętaj, że jest to programowy plik php.ini, który jest dołączony do źródła PHP. Więc proszę, nie używaj go w produkcji!


Po prostu nie rób tego podczas produkcji

To naprawdę najlepszy sposób na uniknięcie WSOD w rozwoju. Każdy, kto sugeruje umieszczenie ini_set('display_errors', 1);lub error_reporting(E_ALL);na górze skryptu PHP lub użycie pliku .htaccess tak jak tutaj, nie pomoże uniknąć WSOD, gdy wystąpi błąd składni lub parsowania (jak w twoim przypadku), jeśli załadowany plik konfiguracyjny został display_errorswyłączony.

Wiele osób (i standardowe instalacje PHP) będzie używać display_errorsdomyślnie wyłączonego pliku produkcyjnego , co zwykle powoduje tę samą frustrację, jakiej tutaj doświadczyłeś. Ponieważ PHP już go wyłączyło, kiedy się uruchamia, napotyka błąd składni lub parsowania i nie daje żadnych wyników. Oczekujesz, że Twój ini_set('display_errors',1);skrypt PHP powinien tego uniknąć, ale nie będzie miało znaczenia, czy PHP nie będzie w stanie przeanalizować twojego kodu, ponieważ nigdy nie dotrze do środowiska wykonawczego.

szeryf
źródło
17

Jeśli jesteś super fajny, możesz spróbować:

$test_server = $_SERVER['SERVER_NAME'] == "127.0.0.1" || $_SERVER['SERVER_NAME'] == "localhost" || substr($_SERVER['SERVER_NAME'],0,3) == "192";

ini_set('display_errors',$test_server);
error_reporting(E_ALL|E_STRICT);

Spowoduje to wyświetlenie błędów tylko podczas działania lokalnego. Daje ci również zmienną test_server do użycia w innych miejscach, gdzie jest to właściwe.

Błędy, które wystąpią przed uruchomieniem skryptu, nie zostaną wychwycone, ale w przypadku 99% błędów, które popełniam, nie stanowi to problemu.

Rich Bradshaw
źródło
2
Jeśli rozróżniasz środowiska lokalne i produkcyjne, powinieneś po prostu włączać lub wyłączać błędy globalnie (w pliku php.ini), a nie w kodzie, który może być również kodem produkcyjnym. Jeśli potrzebujesz debugować witrynę produkcyjną w jej środowisku produkcyjnym i chcesz tylko, abyś mógł wyświetlać błędy, użyj, $_SERVER['REMOTE_HOST']aby sprawdzić, czy klient jest tobą.
Jaap Haagmans
17

Na górze strony wybierz parametr

error_reporting(E_ERROR | E_WARNING | E_PARSE);
Kld
źródło
16

Aby to utrzymać i zapewnić wygodę, możesz edytować plik php.ini. Zwykle jest przechowywany w /etc/php.inilub /etc/php/php.ini, ale więcej lokalnych php.inimoże go zastąpić, w zależności od wytycznych dotyczących konfiguracji dostawcy usług hostingowych. Sprawdź phpinfo()plik Loaded Configuration Fileu góry, aby upewnić się, który z nich zostanie załadowany jako ostatni.

Wyszukaj display_errors w tym pliku. Powinny być tylko 3 instancje, z których 2 są komentowane.

Zmień niekomentowaną linię na:

display_errors = stdout
Baran
źródło
16

Nie wiem, czy to pomoże, ale oto fragment mojego standardowego pliku konfiguracyjnego dla projektów php. Zwykle nie polegam zbytnio na konfiguracjach apache, nawet na własnym serwerze.

Nigdy nie mam problemu z znikającym błędem, więc może coś tutaj da ci pomysł.

Edytowano, aby pokazać APPLICATON_LIVE

/*
APPLICATION_LIVE will be used in process to tell if we are in a development or production environment.  It's generally set as early as possible (often the first code to run), before any config, url routing, etc.
*/

if ( preg_match( "%^(www.)?livedomain.com$%", $_SERVER["HTTP_HOST"]) ) {
    define('APPLICATION_LIVE', true);
} elseif ( preg_match( "%^(www.)?devdomain.net$%", $_SERVER["HTTP_HOST"]) ) {
    define('APPLICATION_LIVE', false);
} else {
    die("INVALID HOST REQUEST (".$_SERVER["HTTP_HOST"].")");
    // Log or take other appropriate action.
}


/*
--------------------------------------------------------------------
DEFAULT ERROR HANDLING
--------------------------------------------------------------------
Default error logging.  Some of these may be changed later based on APPLICATION_LIVE.
*/
error_reporting(E_ALL & ~E_STRICT);
ini_set ( "display_errors", "0");
ini_set ( "display_startup_errors", "0");
ini_set ( "log_errors", 1);
ini_set ( "log_errors_max_len", 0);
ini_set ( "error_log", APPLICATION_ROOT."logs/php_error_log.txt");
ini_set ( "display_errors", "0");
ini_set ( "display_startup_errors", "0");

if ( ! APPLICATION_LIVE ) {
    // A few changes to error handling for development.
    // We will want errors to be visible during development.
    ini_set ( "display_errors", "1");
    ini_set ( "display_startup_errors", "1");
    ini_set ( "html_errors", "1");
    ini_set ( "docref_root", "http://www.php.net/");
    ini_set ( "error_prepend_string", "<div style='color:red; font-family:verdana; border:1px solid red; padding:5px;'>");
    ini_set ( "error_append_string", "</div>");
}
Eli
źródło
@Eli, Ma to jednak narzut związany z czasem działania na żądanie strony .
Pacerier
do 1 za koncepcję pomijającą ustawienia debugowania, jednak serwer jest skonfigurowany, dobry podczas wdrażania lub konserwacji (w fazie rozwoju)
justnajm
15
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
ini_set('html_errors', 1);

Ponadto możesz uzyskać bardziej szczegółowe informacje dzięki xdebug .

Yan.Zero
źródło
Xdebug można włączyć z php.ini
jewelhuq
15

Polecam Nette Tracy dla lepszej wizualizacji błędów i wyjątków w PHP:

Zrzut ekranu Nette Tracy

Ondřej Šotek
źródło
3
Tracy dba o prawidłowe ustawienie wszystkich błędów wyświetlania i opcji raportowania błędów, aby zapewnić wyjście w sytuacjach opisanych w oryginalnym poście ... Więc to narzędzie jest szczególnie pomocne w rozwiązywaniu problemów z pytaniem „Czy ktoś może polecić dobre wskazówki, narzędzia i techniki debugowania PHP? „.
Jan Drábek
15
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Abuzer Firdousi
źródło
10
error_reporting(E_ALL | E_STRICT);

I włącz błędy wyświetlania w php.ini

Lalafur Waage
źródło
9

Możesz zarejestrować swój własny moduł obsługi błędów w PHP. Zrzucenie wszystkich błędów do pliku może na przykład pomóc w tych mało znanych przypadkach. Zauważ, że twoja funkcja zostanie wywołana, bez względu na to, jakie jest twoje bieżące raportowanie błędów . Bardzo prosty przykład:

function dump_error_to_file($errno, $errstr) {
    file_put_contents('/tmp/php-errors', date('Y-m-d H:i:s - ') . $errstr, FILE_APPEND);
}
set_error_handler('dump_error_to_file');
soulmerge
źródło
7

Dwie kluczowe linie potrzebne do uzyskania przydatnych błędów z PHP to:

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

Jak zauważyli inni autorzy, są one domyślnie wyłączone ze względów bezpieczeństwa. Przydatna wskazówka - podczas konfigurowania witryny przydatne jest przełączenie różnych środowisk, aby te błędy były domyślnie WŁĄCZONE w środowiskach lokalnych i programistycznych. Można to osiągnąć za pomocą następującego kodu (najlepiej w pliku index.php lub pliku konfiguracyjnym, aby był on aktywny od samego początku):

switch($_SERVER['SERVER_NAME'])
{
    // local
    case 'yourdomain.dev':
    // dev
    case 'dev.yourdomain.com':
        ini_set('display_errors',1);
        error_reporting(E_ALL);
    break;
    //live
    case 'yourdomain.com':
        //...
    break;
}
Synteza kodu
źródło
6

Przydatny może być także FirePHP .

Rich Bradshaw
źródło
Powinienem zauważyć, że FirePHP to martwy projekt, ponieważ FireBug został zintegrowany z konsolą Firefox. ChromePHP jest swego rodzaju następcą, ale nie do końca.
Machavity
6

otwórz plik php.ini, upewnij się, że jest ustawiony na:

display_errors = On

zrestartuj serwer.

użytkownik577803
źródło
6

Możesz także wypróbować PHPStorm jako edytor kodu. Znajdzie wiele błędów PHP i innych błędów składniowych podczas pisania w edytorze.

użytkownik1681048
źródło
6

jeśli jesteś użytkownikiem Ubuntu, wejdź do terminalu i uruchom tę komendę

sudo tail -50f /var/log/apache2/error.log

gdzie wyświetli 50 ostatnich błędów. Istnieje plik błędów error.logdla Apache2, który rejestruje wszystkie błędy.

Ashutosh Jha
źródło
5

Aby włączyć pełne raportowanie błędów, dodaj to do skryptu:

error_reporting(E_ALL);

To powoduje, że pojawiają się nawet minimalne ostrzeżenia. I na wszelki wypadek:

ini_set('display_errors', '1');

Wymusi wyświetlanie błędów. Powinno to być wyłączone na serwerach produkcyjnych, ale nie podczas programowania.

Daniel Sorichetti
źródło
Podobnie jak w przypadku odpowiedzi Tomalaka, nie działa to w przypadku błędów składniowych.
Darryl Hein
5

„BŁĘDY” to najbardziej przydatne rzeczy dla programistów, którzy znają swoje błędy i rozwiązują je, aby system działał idealnie.

PHP zapewnia kilka lepszych sposobów, aby dowiedzieć się, dlaczego i gdzie ich fragment kodu zawiera błędy, więc znając te błędy, programiści mogą ulepszyć swój kod na wiele sposobów.

Najlepsze sposoby napisania następujących dwóch wierszy na górze skryptu, aby uzyskać wszystkie komunikaty o błędach:

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

Kolejny sposób użycia narzędzi do debugowania, takich jak xdebug, w twoim IDE.

Janyk
źródło
4

Możesz włączyć pełne raportowanie błędów (w tym powiadomienia i ścisłe komunikaty). Niektórzy uważają to za zbyt szczegółowe, ale warto spróbować. Ustaw error_reportingna E_ALL | E_STRICTw swoim php.ini.

error_reporting = E_ALL | E_STRICT

E_STRICT powiadomi Cię o przestarzałych funkcjach i poda zalecenia dotyczące najlepszych metod wykonywania niektórych zadań.

Jeśli nie chcesz powiadomień, ale uważasz, że inne typy wiadomości są pomocne, spróbuj wykluczyć powiadomienia:

error_reporting = (E_ALL | E_STRICT) & ~E_NOTICE

Upewnij się także, że display_errorsjest włączony w php.ini. Jeśli twoja wersja PHP jest starsza niż 5.2.4, ustaw ją na On:

display_errors = "On"

Jeśli masz wersję 5.2.4 lub nowszą, użyj:

display_errors = "stderr"
Ayman Hourieh
źródło
4

Oprócz raportowania błędów i ustawienia ini display_errors, możesz uzyskać błędy SYNTAX z plików dziennika serwera WWW. Kiedy rozwijam PHP, ładuję logi serwera WWW mojego systemu programistycznego do mojego edytora. Ilekroć testuję stronę i pojawia się pusty ekran, plik dziennika staje się przestarzały, a mój edytor pyta, czy chcę go ponownie załadować. Kiedy to robię, przeskakuję na dół i pojawia się błąd składniowy. Na przykład:

[Sun Apr 19 19:09:11 2009] [error] [client 127.0.0.1] PHP Parse error:  syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in D:\\webroot\\test\\test.php on line 9
jmucchiello
źródło
3

Dla tych, którzy używają nginx i mają biały ekran nawet dla plików z <?php echo 123;. W moim przypadku nie miałem tej wymaganej opcji dla PHP w pliku konfiguracyjnym nginx:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

Ta opcja nie była zawarta w pliku fastcgi_params, więc PHP nie działało i nie było żadnych błędów w logach.

AVKurov
źródło
Miałem ten sam problem i jego brak spowodował domyślny plik konfiguracyjny Nginx.
Salem,