@ 451F: Myślę, że kluczowymi słowami są tutaj „surowe standardy”. Nie wiem o poprzednich wersjach, ale w PHP 5.4.0 zaleca się ustawienie raportowania błędów E_ALL & ~E_DEPRECATED & ~E_STRICTna produkcję. Zauważ, że sugerują wyłączenie ścisłych standardów.
Fałszywy kod Monkey Rashid
Zlokalizuj
Odpowiedzi:
185
Chcesz wyłączyć raportowanie błędów, czy po prostu uniemożliwić użytkownikowi ich wyświetlanie? Zwykle dobrym pomysłem jest rejestrowanie błędów, nawet w witrynie produkcyjnej.
# in your PHP code:
ini_set('display_errors','0');# don't show any errors...
error_reporting(E_ALL | E_STRICT);# ...but do log them
Zostaną zapisane w standardowym dzienniku systemowym lub użyj error_logdyrektywy, aby dokładnie określić, gdzie mają trafiać błędy.
Żeby wyraźnie powiedzieć, co oczywiste: oczywiście możesz ustawić je również w swoim php.inipliku, np. Jeśli nie możesz zmodyfikować kodu PHP.
sschuberth
1
Jednak rejestrowanie ścisłych błędów w produkcji jest również złą praktyką. Ponieważ wypełnisz swoje dzienniki powiadomieniami, które prawdopodobnie nie mają znaczenia, powodując jeden lub oba z następujących problemów: serverAdmin pominie / zignoruje błędy, a katalog dziennika w pewnym momencie zajmie całe miejsce na serwerze.
Lance
4
To nie działa dla mnie - musiałem użyć E_ALL i ~ E_STRICT z Fake Code Monkey Rashid komentarz z odpowiedzi poniżej
besimple
1
jak to działa w połączeniu z poniższymi, które znalazłem w moim php.ini log_errors = On Vs ini_set ('display_errors', '0'); Czy wygrywa ostatni set?
wylądował
@nate. Kiedy wysyłasz kod, powiedz nam, gdzie możemy go wkleić. Nie wiem, gdzie go umieścić: na php.inilub .htaccesslub gdzieś w moim kodu PHP.
Даниил Пронин
89
Bez błędów.
error_reporting(0);
lub po prostu nie surowe
error_reporting(E_ALL ^ E_STRICT);
a jeśli kiedykolwiek zechcesz ponownie wyświetlić wszystkie błędy, użyj
+1: Myślę, że ^jest dobry tylko do pominięcia jednego rodzaju błędu. Jeśli chcesz wyłączyć dodatkowe typy, powinieneś użyć E_ALL & ~E_DEPRECATED & ~E_STRICTformatu. A może (E_ALL & ~(E_DEPRECATED | E_STRICT))format.
Fałszywy kod Monkey Rashid
10
Uwaga: E_STRICT jest częścią E_ALL dopiero od php 5.4
Fred Haslam
@FakeCodeMonkeyRashid Zastanawiam się, dlaczego tak jest? chyba dlatego, że w takim razie kolejność ewaluacji jest ważna?
Chcę zaznaczyć, że używanie ^("xor") zamiast & ~("i nie") jest złym pomysłem ! ^zależy od założenia, że np. E_STRICT jest częścią E_ALL i zawsze będzie jej częścią. To jest złe, ponieważ E_ALL zmieniło się w przeszłości (E_STRICT nie było przeszłością, ale jest teraz od PHP 5.4). Jeśli założenie zawiedzie pewnego dnia, ^nie tylko się zepsuje , ale w rzeczywistości zrobi odwrotnie niż powinno: włączy E_STRICT ze względu na sposób działania XOR ( ^). & ~jednak zawsze wyłącza E_STRICT, bez względu na aktualną wartość E_ALL. Dlatego & ~powinien być używany.
Jay
31
Wszystkie powyższe rozwiązania są poprawne. Ale kiedy mówimy o normalnej aplikacji PHP, muszą one być zawarte na każdej stronie, której wymaga. Sposobem na rozwiązanie tego problemu jest przejście .htaccessdo folderu głównego. Tylko po to, żeby ukryć błędy. [Umieść jedną z poniższych linii w pliku]
php_flag display_errors off
Lub
php_value display_errors 0
Następnie, aby ustawić raportowanie błędów
php_value error_reporting 30719
Jeśli zastanawiasz się, skąd 30719pochodzi ta wartość , E_ALL (32767), E_STRICT (2048) są w rzeczywistości stałymi, które przechowują wartość liczbową i ( 32767 - 2048 = 30719)
Wielkie dzięki - to załatwiło sprawę (rozwiązanie .htaccess) w PHP 5.4.7 - nic innego - nawet modyfikacja .ini - nie załatwiało sprawy.
Użyłem php_admin_value error_reportingdo tego do pracy (w konfiguracji vhost).
Lou Terrailloune
@Seza, poprawne Naprawiono to.
Starx
1
nie chodzi o stronę, ta metoda jest preferowana, ponieważ większość błędów E_STRICT występuje w czasie kompilacji i nie można ich zastąpić w czasie wykonywania
AbiusX
2
Cześć, żeby to trochę ułatwić, dla tych, którzy używają wampa, możesz wyłączyć błędy, klikając php> ustawienia php >> błędy wyświetlania. Jeśli jest zaznaczone, odznacz je.
Hemang Rami
9
Domyślna wartość error_reporting flaga jest E_ALL & ~ E_NOTICE jeśli nie jest ustawiona w pliku php.ini. Ale w niektórych instalacjach (szczególnie instalacjach przeznaczonych dla środowisk programistycznych) ma E_ALL | E_STRICT ustawione jako wartość tej flagi (jest to wartość zalecana podczas programowania ). W niektórych przypadkach, szczególnie gdy będziesz chciał uruchomić niektóre projekty open source, które zostały opracowane przed erą PHP 5.3 i nie zostały jeszcze zaktualizowane przy użyciu najlepszych praktyk zdefiniowanych w PHP 5.3, w swoim środowisku programistycznym prawdopodobnie napotkasz wiadomości, które otrzymujesz. Najlepszym sposobem radzenia sobie w tej sytuacji jest ustawienie tylko E_ALL jako wartości flagi error_reporting , albo wphp.ini lub w kodzie (prawdopodobnie w kontrolerze frontowym, takim jak index.php w katalogu głównym sieci, w następujący sposób:
Jeśli pracujesz w środowisku wordpress, Wordpress ustawia poziom błędu w pliku wp-include / load.php w function wp_debug_mode(). Więc musisz zmienić poziom PO wywołaniu tej funkcji (w pliku nie wpisanym do gita, więc jest to tylko programowanie) lub bezpośrednio zmodyfikować error_reporting()wywołanie
Jest to bardzo przydatne, miałem włączony tryb debugowania dla jednej instalacji Wordpress i nie zdawałem sobie sprawy, że to zrobiło. Dzięki za informację!
Tim
2
Nie widziałem odpowiedzi, która byłaby czysta i odpowiednia dla oprogramowania gotowego do produkcji, więc oto jest:
/*
* Get current error_reporting value,
* so that we don't lose preferences set in php.ini and .htaccess
* and accidently reenable message types disabled in those.
*
* If you want to disable e.g. E_STRICT on a global level,
* use php.ini (or .htaccess for folder-level)
*/
$old_error_reporting = error_reporting();/*
* Disable E_STRICT on top of current error_reporting.
*
* Note: do NOT use ^ for disabling error message types,
* as ^ will re-ENABLE the message type if it happens to be disabled already!
*/
error_reporting($old_error_reporting &~E_STRICT);// code that should not emit E_STRICT messages goes here/*
* Optional, depending on if/what code comes after.
* Restore old settings.
*/
error_reporting($old_error_reporting);
E_ALL & ~E_DEPRECATED & ~E_STRICT
na produkcję. Zauważ, że sugerują wyłączenie ścisłych standardów.Odpowiedzi:
Chcesz wyłączyć raportowanie błędów, czy po prostu uniemożliwić użytkownikowi ich wyświetlanie? Zwykle dobrym pomysłem jest rejestrowanie błędów, nawet w witrynie produkcyjnej.
Zostaną zapisane w standardowym dzienniku systemowym lub użyj
error_log
dyrektywy, aby dokładnie określić, gdzie mają trafiać błędy.źródło
php.ini
pliku, np. Jeśli nie możesz zmodyfikować kodu PHP.php.ini
lub.htaccess
lub gdzieś w moim kodu PHP.Bez błędów.
error_reporting(0);
lub po prostu nie surowe
error_reporting(E_ALL ^ E_STRICT);
a jeśli kiedykolwiek zechcesz ponownie wyświetlić wszystkie błędy, użyj
error_reporting(-1);
źródło
^
jest dobry tylko do pominięcia jednego rodzaju błędu. Jeśli chcesz wyłączyć dodatkowe typy, powinieneś użyćE_ALL & ~E_DEPRECATED & ~E_STRICT
formatu. A może(E_ALL & ~(E_DEPRECATED | E_STRICT))
format.ini_set('error_reporting', E_ALL&~E_STRICT);
Wyłącz raportowanie błędówini_set('error_reporting', E_ALL^E_STRICT);
^
("xor") zamiast& ~
("i nie") jest złym pomysłem !^
zależy od założenia, że np. E_STRICT jest częścią E_ALL i zawsze będzie jej częścią. To jest złe, ponieważ E_ALL zmieniło się w przeszłości (E_STRICT nie było przeszłością, ale jest teraz od PHP 5.4). Jeśli założenie zawiedzie pewnego dnia,^
nie tylko się zepsuje , ale w rzeczywistości zrobi odwrotnie niż powinno: włączy E_STRICT ze względu na sposób działania XOR (^
).& ~
jednak zawsze wyłącza E_STRICT, bez względu na aktualną wartość E_ALL. Dlatego& ~
powinien być używany.Wszystkie powyższe rozwiązania są poprawne. Ale kiedy mówimy o normalnej aplikacji PHP, muszą one być zawarte na każdej stronie, której wymaga. Sposobem na rozwiązanie tego problemu jest przejście
.htaccess
do folderu głównego. Tylko po to, żeby ukryć błędy. [Umieść jedną z poniższych linii w pliku]Lub
Następnie, aby ustawić raportowanie błędów
Jeśli zastanawiasz się, skąd
30719
pochodzi ta wartość , E_ALL (32767), E_STRICT (2048) są w rzeczywistości stałymi, które przechowują wartość liczbową i (32767 - 2048 = 30719
)źródło
php_admin_value error_reporting
do tego do pracy (w konfiguracji vhost).Domyślna wartość error_reporting flaga jest E_ALL & ~ E_NOTICE jeśli nie jest ustawiona w pliku php.ini. Ale w niektórych instalacjach (szczególnie instalacjach przeznaczonych dla środowisk programistycznych) ma E_ALL | E_STRICT ustawione jako wartość tej flagi (jest to wartość zalecana podczas programowania ). W niektórych przypadkach, szczególnie gdy będziesz chciał uruchomić niektóre projekty open source, które zostały opracowane przed erą PHP 5.3 i nie zostały jeszcze zaktualizowane przy użyciu najlepszych praktyk zdefiniowanych w PHP 5.3, w swoim środowisku programistycznym prawdopodobnie napotkasz wiadomości, które otrzymujesz. Najlepszym sposobem radzenia sobie w tej sytuacji jest ustawienie tylko E_ALL jako wartości flagi error_reporting , albo wphp.ini lub w kodzie (prawdopodobnie w kontrolerze frontowym, takim jak index.php w katalogu głównym sieci, w następujący sposób:
źródło
W zestawie php.ini:
źródło
WordPress
Jeśli pracujesz w środowisku wordpress, Wordpress ustawia poziom błędu w pliku wp-include / load.php w function
wp_debug_mode()
. Więc musisz zmienić poziom PO wywołaniu tej funkcji (w pliku nie wpisanym do gita, więc jest to tylko programowanie) lub bezpośrednio zmodyfikowaćerror_reporting()
wywołanieźródło
Nie widziałem odpowiedzi, która byłaby czysta i odpowiednia dla oprogramowania gotowego do produkcji, więc oto jest:
źródło