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życia ini_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 i error_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ój apache.conf
lub httpd.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ę, że display_errors = 1
i error_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 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_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ó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.