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?
php
debugging
error-handling
Candidasa
źródło
źródło
T_PAAMAYIM_NEKUDOTAYIM
. A może „musi być wystąpieniem liczby całkowitej, podanej liczby całkowitej” .Odpowiedzi:
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_reporting
idisplay_errors
.display_errors
jest 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:Możesz rozważyć użycie wartości E_ALL (jak wspomniano w Gumbo) dla swojej wersji PHP,
error_reporting
aby uzyskać wszystkie błędy. więcej informacji3 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:
(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/
źródło
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.phpNastępujące włącza wszystkie błędy:
Zobacz także następujące linki
źródło
ini_set
jest łańcuch.Poniższy kod powinien wyświetlać wszystkie błędy:
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.
źródło
ShutdownHandler
powyższej funkcji . Zasadniczo jest to hack stopgap zamiast prawidłowej obsługi błędów.E_NOTICE
błędy w tej funkcji?Błędy i ostrzeżenia zwykle pojawiają się w ustawieniach php.ini
....\logs\php_error.log
lub w....\logs\apache_error.log
zależ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.źródło
php_flag display_errors 1
.Do pliku, który chcesz debugować, możesz dołączyć następujące wiersze:
To zastępuje ustawienia domyślne w php.ini, które powodują, że PHP zgłasza błędy do dziennika.
źródło
Konfiguracja PHP
2 wpisy w php.ini dyktują wyjście błędów:
display_errors
error_reporting
W produkcji ,
display_errors
jest 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ć
On
tak, aby wyświetlały się błędy. Sprawdź !error_reporting
(od PHP 5.3) jest domyślnie ustawiony naE_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_ALL
wyś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!
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_log
wpisem.źródło
Istnieje naprawdę przydatne rozszerzenie o nazwie „ xdebug ”, które sprawi, że twoje raporty również będą ładniejsze.
źródło
Zawsze używam tej składni na samym początku skryptu php.
źródło
W celu szybkiego, praktycznego rozwiązywania problemów zwykle sugeruję tutaj w SO:
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.ini
i 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:
Zobacz także:
error_reporting()
Dokumentydisplay_errors
Dokumentyźródło
Możliwe jest zarejestrowanie haka, aby widoczny był ostatni błąd lub ostrzeżenie.
dodanie tego kodu na początku twojego index.php pomoże ci w debugowaniu problemów.
źródło
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_errors
konfigurację PHP w czasie wykonywania (obejmuje to wszystko od użyciaini_set
w 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_errors
włączony ierror_reporting
ustawiony 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.ini
plik lub Twójapache.conf
lubhttpd.conf
lub 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ę, żedisplay_errors = 1
ierror_reporting = -1
w 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 podobnegoini_set('display_errors', 1);
luberror_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 ...
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 pliku
phpinfo()
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);
luberror_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_errors
wyłączony.Wiele osób (i standardowe instalacje PHP) będzie używać
display_errors
domyś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ójini_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.źródło
Jeśli jesteś super fajny, możesz spróbować:
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.
źródło
$_SERVER['REMOTE_HOST']
aby sprawdzić, czy klient jest tobą.Na górze strony wybierz parametr
źródło
Aby to utrzymać i zapewnić wygodę, możesz edytować plik php.ini. Zwykle jest przechowywany w
/etc/php.ini
lub/etc/php/php.ini
, ale więcej lokalnychphp.ini
może go zastąpić, w zależności od wytycznych dotyczących konfiguracji dostawcy usług hostingowych. Sprawdźphpinfo()
plikLoaded 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 instancje, z których 2 są komentowane.
Zmień niekomentowaną linię na:
źródło
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
źródło
Ponadto możesz uzyskać bardziej szczegółowe informacje dzięki xdebug .
źródło
Polecam Nette Tracy dla lepszej wizualizacji błędów i wyjątków w PHP:
źródło
źródło
I włącz błędy wyświetlania w php.ini
źródło
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:
źródło
Dwie kluczowe linie potrzebne do uzyskania przydatnych błędów z PHP to:
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):
źródło
Przydatny może być także FirePHP .
źródło
otwórz plik php.ini, upewnij się, że jest ustawiony na:
zrestartuj serwer.
źródło
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.
źródło
jeśli jesteś użytkownikiem Ubuntu, wejdź do terminalu i uruchom tę komendę
gdzie wyświetli 50 ostatnich błędów. Istnieje plik błędów
error.log
dla Apache2, który rejestruje wszystkie błędy.źródło
Aby włączyć pełne raportowanie błędów, dodaj to do skryptu:
To powoduje, że pojawiają się nawet minimalne ostrzeżenia. I na wszelki wypadek:
Wymusi wyświetlanie błędów. Powinno to być wyłączone na serwerach produkcyjnych, ale nie podczas programowania.
źródło
„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:
Kolejny sposób użycia narzędzi do debugowania, takich jak xdebug, w twoim IDE.
źródło
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_reporting
naE_ALL | E_STRICT
w swoim php.ini.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:
Upewnij się także, że
display_errors
jest włączony w php.ini. Jeśli twoja wersja PHP jest starsza niż 5.2.4, ustaw ją naOn
:Jeśli masz wersję 5.2.4 lub nowszą, użyj:
źródło
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:
źródło
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: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.
źródło