PHP 5 wyłącza błąd ścisłych standardów

175

Muszę ustawić skrypt PHP na górze, aby wyłączyć raportowanie błędów ze względu na ścisłe standardy.

Czy ktoś może pomóc?

Manny Calavera
źródło
8
@ 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.

Nate
źródło
11
Ż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

error_reporting(-1);

Tyler Carter
źródło
56
+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?
kodowanie
Wyłącz raportowanie błędów STRICT w PHP <5.4 ini_set('error_reporting', E_ALL&~E_STRICT); Wyłącz raportowanie błędów ini_set('error_reporting', E_ALL^E_STRICT);
STRICT
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)

Starx
źródło
2
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:

if(defined('E_STRICT')){
    error_reporting(E_ALL);
}
MN Islam Shihan
źródło
8

W zestawie php.ini:

error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT
MSS
źródło
4

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

Nicola Peluchetti
źródło
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);
Sójka
źródło