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

Uważam programowanie w PHP za dość frustrujące. Dość często będę próbował uruchomić skrypt i po prostu uzyskać pusty ekran z powrotem. Brak Komunikatu o błędzie, po prostu pusty ekran. Przyczyną mógł być prosty błąd składni (niewłaściwy nawias, brak średnika), nieudane wywołanie funkcji lub coś zupełnie innego.

Bardzo trudno jest ustalić, co poszło nie tak. Kończę na komentowaniu kodu, wpisywaniu wszędzie poleceń "echo" itp. próbuję zawęzić problem. Ale tam na pewno musi być lepszy sposób, prawda?.

Więc, czy istnieje sposób, aby PHP produkować użyteczny komunikat o błędzie, jak robi to Java? Czy ktoś może polecić dobre Porady, Narzędzia i techniki debugowania PHP?

Author: Taryn, 2009-05-10

29 answers

W przypadku błędów składniowych, musisz włączyć wyświetlanie błędów w 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_reporting i display_errors. display_errors to prawdopodobnie ten, który chcesz zmienić. Jeśli nie możesz zmodyfikować php.ini, możesz również dodać następujące wiersze do an .plik htaccess:

php_flag  display_errors        on
php_value error_reporting       2039

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

3 inne pozycje: (1) możesz sprawdzić plik dziennika błędów, ponieważ będzie zawierał wszystkie błędy(chyba że logowanie zostało wyłączone). (2) dodanie następujących 2 linii pomoże Ci debugować błędy, które nie są błędami składni:

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

(3) inną opcją jest użycie edytora, który sprawdza błędy podczas pisania, np. PhpEd . PhpEd jest również wyposażony w debugger, który może zapewnić bardziej szczegółowe informacje. (Debugger PhpEd jest bardzo podobny do Xdebug i integruje się bezpośrednio z edytorem, więc do wszystkiego używasz 1 programu.)

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

 448
Author: Darryl Hein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-10 12:27:57

Poniższe 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

 422
Author: Eljakim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-09 22:25:08

W pliku, który chcesz debugować, możesz umieścić następujące linie:

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

To nadpisuje domyślne ustawienia w php.ini, które po prostu sprawiają, że PHP zgłasza błędy do dziennika.

 52
Author: Tomalak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-10 09:54:31

Konfiguracja PHP

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

  1. display_errors
  2. error_reporting

W produkcji, display_errors jest zwykle ustawiony na Off (co jest dobrą rzeczą, ponieważ wyświetlanie błędów w zakładach produkcyjnych nie jest ogólnie pożądane!).

Jednakże, w rozwoju , powinno być ustawione na On, aby błędy były wyświetlane. Sprawdź !

error_reporting (PHP 5.3) jest domyślnie ustawione 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 ustaw ją na E_ALL, aby wyświetlić Wszystkie błędy. Sprawdź !

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

Szkoda. Zazwyczaj współdzielone hosty nie pozwalają na zmianę ich php.plik ini, a więc ta opcja jest niestety niedostępna. Ale nie bój się! Mamy inne opcje!

Konfiguracja Runtime

W pożądanym skrypcie możemy zmienić php.wpisy ini w runtime! Oznacza to, że będzie działać, gdy skrypt działa! Super!

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

Te dwie linie zrobią taki sam efekt jak zmiana php.wpisy ini jak wyżej! Super!

I still get a blank page / 500 error!

To znaczy, że skrypt nawet nie zadziałał! To zwykle dzieje się, gdy masz błąd składni!

Z błędami składni, skrypt nawet nie przejdź do runtime. Nie powiedzie się w czasie kompilacji , co oznacza, że użyje wartości w php.ini, które, jeśli nie zmieniłeś, może nie zezwalać na wyświetlanie błędów.

Dzienniki błędów

Dodatkowo PHP domyślnie rejestruje błędy. W hostingu współdzielonym może znajdować się w dedykowanym folderze lub w tym samym folderze co skrypt naruszający.

Jeśli masz dostęp do php.ini, znajdziesz go pod error_log wejście.

 47
Author: Madara Uchiha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:33:26

Istnieje naprawdę przydatne rozszerzenie o nazwie " xdebug ", które uczyni Twoje raporty znacznie milszymi.

 26
Author: gnarf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-10 09:59:30

Dla szybkiego, praktycznego rozwiązywania problemów Zwykle sugeruję tutaj tak:

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

Należy umieścić na początku skryptu, który jest w trakcie rozwiązywania problemów. To nie jest idealne, idealnym wariantem jest to, że możesz również włączyć to w php.ini i że logujesz błędy w PHP, aby złapać błędy składni i uruchamiania.

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

Następne rzeczy do consider:

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

Zobacz też:

 22
Author: hakre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-24 15:18:06

Jeśli jesteś super cool, 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);

Wyświetli błędy tylko wtedy, gdy jesteś uruchomiony lokalnie. Daje również zmienną test_server do użycia w innych miejscach, gdzie jest to właściwe.

Wszelkie błędy, które wystąpią przed uruchomieniem skryptu, nie zostaną wychwycone, ale dla 99% błędów, które popełniam, nie jest to problemem.

 15
Author: Rich Bradshaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-04 19:49:30

Na górze strony wybierz parametr

error_reporting(E_ERROR | E_WARNING | E_PARSE);
 14
Author: Kld,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-06 14:14:25

Aby utrzymać to i uczynić go confortale, możesz edytować swoje php.plik ini. Zazwyczaj jest on przechowywany w /etc/php.ini lub /etc/php/php.ini, ale bardziej lokalne php.ini mogą go zastąpić, w zależności od wytycznych dostawcy hostingu. Sprawdź phpinfo() Plik Loaded Configuration File u góry, aby upewnić się, który z nich zostanie załadowany jako ostatni.

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

Zmień nieakcentowany wiersz na:

display_errors = stdout
 12
Author: Ram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-16 07:46:55
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
ini_set('html_errors', 1);

Ponadto możesz uzyskać bardziej szczegółowe informacje za pomocą xdebug .

 11
Author: Yan.Zero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-09 22:26:07

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

Nette Tracy zrzut ekranu

 10
Author: Ondřej Šotek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-09 23:41:16
error_reporting(E_ALL | E_STRICT);

I włączyć wyświetlanie błędów w php.ini

 8
Author: Ólafur Waage,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-10 09:54:53

Możesz zarejestrować własną obsługę błędów w PHP. Wrzucenie wszystkich błędów do pliku może pomóc na przykład w tych niejasnych przypadkach. Zauważ, że twoja funkcja zostanie wywołana, bez względu na to, na jaką wartość jest ustawiona bieżąca wartość error_reporting. Bardzo podstawowy 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');
 7
Author: soulmerge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-10 09:54:10

Wypróbuj to PHP Error reporting reference tool. Jest to bardzo dobre odniesienie wizualne i pomogło mi zrozumieć złożony mechanizm raportowania błędów.

 6
Author: Rodney McIntosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-25 13:30:20

Możesz również wypróbować PHPStorm jako edytor kodu. Znajdzie wiele błędów PHP i innych składni zaraz po wpisaniu w edytorze.

 6
Author: user1681048,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-18 01:03:15

Dwie kluczowe linie, których potrzebujesz, aby uzyskać przydatne błędy z PHP to:

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

Jak zauważyli inni współpracownicy, są one domyślnie wyłączone ze względów bezpieczeństwa. Przydatna wskazówka - podczas konfigurowania witryny warto wykonać przełącznik dla różnych środowisk, aby błędy te były domyślnie włączone w środowiskach lokalnych i deweloperskich. Można to osiągnąć za pomocą następującego kodu (najlepiej w indeksie.php lub pliku konfiguracyjnego, więc jest on aktywny z początek): {]}

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;
}
 6
Author: Code Synthesis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-24 14:57:42

FirePHP może być również przydatny.

 5
Author: Rich Bradshaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-10 10:21:42

Jeśli jesteś użytkownikiem ubuntu to idź do swojego terminala i uruchom to polecenie

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

Gdzie wyświetli ostatnie 50 błędów. W związku z tym, że nie jesteśmy w stanie sprostać wymaganiom naszych klientów, nie jesteśmy w stanie sprostać ich wymaganiom.

 5
Author: Ashutosh Jha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-10 11:43:08
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
 4
Author: Abuzer Firdousi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-04 20:54:29

Możesz włączyć pełne raportowanie błędów(w tym powiadomienia i ścisłe wiadomości). Niektórzy uważają to za zbyt gadatliwe, ale warto spróbować. Ustaw error_reporting na E_ALL | E_STRICT w php.ini.

error_reporting = E_ALL | E_STRICT

E_STRICT powiadomi Cię o przestarzałych funkcjach i poda zalecenia dotyczące najlepszych metod wykonywania określonych zadań.

Jeśli nie chcesz, aby powiadomienia, ale inne typy wiadomości były pomocne, spróbuj wyłączyć powiadomienia:

error_reporting = (E_ALL | E_STRICT) & ~E_NOTICE

Upewnij się również, że {[7] } jest włączone w php.ini. Jeśli Wersja PHP jest starsza niż 5.2.4, ustaw ją na On:

display_errors = "On"

Jeśli Twoja wersja to 5.2.4 lub nowsza, użyj:

display_errors = "stderr"
 3
Author: Ayman Hourieh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-10 10:04:56

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. 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 tworzenia.

 3
Author: Daniel S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-10 12:09:01

Oprócz error_reporting i ustawienia ini display_errors, możesz uzyskać Błędy składniowe z plików dziennika serwera www. Kiedy rozwijam PHP Ładuję log serwera mojego systemu programistycznego do mojego edytora. Za każdym razem, gdy testuję stronę i dostaję 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 jest błąd składni. 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
 3
Author: jmucchiello,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-10 18:16:21

"błędy" są najbardziej przydatnymi rzeczami dla programistów, którzy znają swoje błędy i rozwiązali je, aby system działał idealnie.

PHP zapewnia kilka lepszych sposobów na poznanie deweloperów, dlaczego i gdzie ich kawałek kodu dostaje błędy, więc znając te błędy programiści mogą uczynić swój kod lepszym na wiele sposobów.

Najlepsze sposoby pisania dwóch wierszy na górze skryptu, aby uzyskać wszystkie komunikaty o błędach:

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

Inny sposób użycia narzędzi debuggera jak xdebug {[9] } w Twoim IDE.

 3
Author: janykste,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-09 22:45:11

Włączenie raportowania błędów jest właściwym rozwiązaniem, jednak wydaje się, że nie działa w programie, który go włącza, ale tylko w dołączonych później programach.

Dlatego zawsze tworzę plik / program (który zwykle nazywam " genwrap.php"), który ma zasadniczo ten sam kod co popularne tutaj rozwiązanie (tj. włącz raportowanie błędów), a także zawiera stronę, którą rzeczywiście chcę zadzwonić.

Istnieją 2 kroki, aby to wdrożyć debugowanie;

One - Utwórz genwrap.php i umieść w nim ten kod:

<?php
error_reporting(-1);
ini_set('display_errors', 'On');

include($_REQUEST['page']);
?>

Dwa - Zmień link do programu / strony, którą chcesz debugować, aby przejść przez genwrap.php,

Eg: change:

$.ajax('dir/pgm.php?param=val').done(function(data) { /* ... */

Do

$.ajax('dir/genwrap.php?page=pgm.php&param=val').done(function(data) { /* ... */
 0
Author: kris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-15 11:55:04

Http://todell.com/debug może być również przydatna. Wartości obiektów lub błędy debugowania są widoczne za sceną nawet w trybie produkcyjnym.

 0
Author: PHPCoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-01 19:48:54

Oprócz bardzo wielu doskonałych odpowiedzi powyżej można również wdrożyć następujące dwie funkcje w swoich projektach. Wychwycą każdy błąd spoza składni przed zakończeniem aplikacji/skryptu. Wewnątrz funkcji można zrobić backtrace i log lub renderować przyjemny komunikat "strona jest w trakcie konserwacji" do wiadomości publicznej.

Fatal Błędy:

register_shutdown_function

Http://php.net/manual/en/function.register-shutdown-function.php

Błędy:

set_error_handler

Http://php.net/manual/en/function.set-error-handler.php

Powrót:

debug_backtrace

Http://php.net/manual/en/function.debug-backtrace.php

 0
Author: Vladimir Ramik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-07 18:16:51

Użyj Kint. Jest to kombinacja debugowania poleceń na sterydach. https://kint-php.github.io/kint/ Jest bardzo podobny do Nette Tracy

 0
Author: siniradam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-06 23:11:57

Oprócz wszystkich wspaniałych odpowiedzi tutaj, chciałbym dodać specjalne wyróżnienie dla MySQLi i PDO bibliotek.

W celu...

  1. zawsze zobacz błędy związane z bazą danych i
  2. unikaj sprawdzania typów zwracanych metod, aby sprawdzić, czy coś poszło nie tak

Najlepszą opcją jest skonfigurowanie bibliotek na throw exceptions.

MySQLi

Dodaj to w górnej części skryptu

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

To jest najlepsze umieszczone przed użyciem new mysqli() lub mysqli_connect().

PDO

Ustaw atrybut PDO::ATTR_ERRMODE na PDO::ERRMODE_EXCEPTION w instancji połączenia. Możesz to zrobić w konstruktorze

$pdo = new PDO('driver:host=localhost;...', 'username', 'password', [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);

Lub po stworzeniu

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 0
Author: Phil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-14 03:31:55

Moim typowym problemem są "małe, głupie" błędy parsera, które Niestety się nie pojawiają.

Jednakże, gdy a .PHP-File zawiera plik, który ma błędy parsera, są one wyświetlane! Więc wpadłem na pomysł napisania małego "executor-script", który jest uruchamiany z nazwą pliku buggy jako argumentem, tzn. example.com/sx.php?sc=buggy.php

Już mnie to uchroniło przed bólem głowy, może komuś innemu też się przyda:)

Sx.php

$sc = $_GET["sc"];
if ((!isset($_GET["sc"]) && empty($_GET["sc"]))) {
    echo "Please select file to execute using ?sc= (you may omit the .PHP-extension)";
} else {
    $sc = $_GET["sc"];
    if (false==stripos('.php',$sc)) $sc.='.php';  // adjust this if your preferred extension is php5!
    require($sc);
}
?>
 -1
Author: MBaas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-09 18:05:23