Wyłączanie ścisłych standardów w PHP 5.4


95

Obecnie prowadzę witrynę na php 5.4, wcześniej korzystałem z niej na 5.3.8. Niestety php 5.4 łączy E_ALLi E_STRICT, co oznacza, że ​​moje poprzednie ustawienie dla error_reportingteraz nie działa. Moja poprzednia wartość to E_ALL & ~E_NOTICE & ~E_STRICTCzy powinienem po prostu włączać wartości pojedynczo?

Mam zbyt wiele błędów, a pliki zawierają zbyt dużo kodu, abym mógł je naprawić.


11
Rada ... Napraw kod albo błędy staną się lepsze i trudniejsze do debugowania
Baba

7
s / Niestety / Na szczęście
NikiC

96
Dzięki za radę, jednak brakuje mi wiedzy wymaganej do przepisania całej wtyczki jfusion phpbb3. dziękuję jednak za protekcjonalność.
icomrade

12
Zgadzam się z naszymi przyjaciółmi, że powinieneś spróbować naprawić błędy, mogą przyjść i ugryźć twoją kostkę, a ukrywanie wszystkich błędów utrudnia debugowanie. Ale nie uważam też, że sprawiedliwe jest ocenianie plakatu na to samotne pytanie, jeśli nigdy nie musiałeś pisać jakiejś ohydnej pracy, ponieważ twój klient rozmawia przez telefon i szkodzi nienarodzonym dzieciom, z którymi nie pracowałeś wystarczająco długo
Jonathan dos Santos

7
To całkiem rozsądne pytanie i tak, @icomrade - masz rację co do protekcjonalności i sarkazmu. Jest to jedna z mniej atrakcyjnych cech StackOverflow. To powiedziawszy, polecam zająć się przynajmniej niektórymi ostrzeżeniami, które otrzymujesz - nawet jeśli nie możesz zrobić ich wszystkich.
halfer

Odpowiedzi:


139

Jak stwierdzili komentatorzy, najlepszą opcją jest naprawienie błędów, ale przy ograniczonym czasie lub wiedzy nie zawsze jest to możliwe. W twojej zmianie php.ini

error_reporting = E_ALL

do

error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT

Jeśli nie masz dostępu do php.ini, możesz potencjalnie umieścić to w swoim pliku .htaccess:

php_value error_reporting 30711

Jest to wartość E_ALL (32767) i usunięcie wartości E_STRICT (2048) i E_NOTICE (8).

Jeśli nie masz dostępu do pliku .htaccess lub nie jest on włączony, prawdopodobnie będziesz musiał umieścić to na początku sekcji PHP każdego skryptu ładowanego przez wywołanie przeglądarki:

error_reporting(E_ALL & ~E_STRICT & ~E_NOTICE);

Jedna z nich powinna pomóc w korzystaniu z oprogramowania. Uwagi i surowe informacje są jednak wskaźnikami problemów lub potencjalnych problemów i może się okazać, że część kodu nie działa poprawnie w PHP 5.4.


11
Używam php 5.4.5 i wypróbowałem wszystkie powyższe, ale nie mogłem wyłączyć ścisłych powiadomień :( jakieś inne pomysły?
ro ko

2
Możesz spróbować umieścić & ~ E_DEPRECATED razem z innymi częściami w error_reporting (). Jakie wiadomości widzisz?
David Stockton,

4
@roko Czy to możliwe, że Twój kod gdzieś to zastępuje? Po wyłączeniu go w php.ini nadal widziałem poważne błędy, a potem zdałem sobie sprawę, że dotyczy to tylko niektórych stron internetowych, tych korzystających z Drupala, gdzie wartość była ustawiana w kodzie
andrewtweber

1
@AndrewSpear To dziwne. Teoretycznie ustawienie error_reporting powinno wpływać na błędy, które są pokazywane w każdym miejscu, w którym są pokazywane. Ustawienie display_errors powinno wpływać na to, czy otrzymujesz błędy na wyjściu (na stronach PHP), a error_log wpłynie na to, gdzie błędy zostaną zapisane w dzienniku. Jeśli display_errors jest włączony, powinieneś zobaczyć te same błędy na ekranie, co w dzienniku.
David Stockton

4
+1 za udzielenie prostej odpowiedzi na proste pytanie bez zamieniania się w StackOverflow Smuglord ™.
Joshua Pech

2

.htaccess php_value działa tylko wtedy, gdy używasz PHP Server API jako modułu serwera WWW Apache. Użyj składni IfModule:

# PHP 5, Apache 1 and 2.
<IfModule mod_php5.c>
    php_value error_reporting 30711
</IfModule>

Jeśli używasz interfejsu API serwera PHP CGI / FastCGI, użyj

ini_set('error_reporting', 30711);

lub

error_reporting(E_ALL & ~E_STRICT & ~E_NOTICE);

w kodzie PHP lub plikach konfiguracyjnych PHP .user.ini | Modyfikacja php.ini:

error_reporting = E_ALL & ~E_STRICT & ~E_NOTICE

na twoim wirtualnym hoście na poziomie serwera.


1

U mnie zadziałało, gdy ustawiłem error_reporting w dwóch miejscach jednocześnie

gdzieś w kodzie PHP

ini_set('error_reporting', 30711);


oraz w pliku .htaccess

php_value error_reporting 30711

Jedyna rzecz, która działała dla mnie bez dostępu do php.ini, inna z powyższych nie działałaby sama, zwróciła tylko błąd 500. Oboje razem kochanie !!!
Jamie Hutber

1

Jeśli chcesz również wyłączyć E_DEPRACATED, użyj:

php_value error_reporting 22527

W moim przypadku CMS Made Simple narzekał „E_STRICT jest włączony w raporcie error_reporting”, a także „E_DEPRECATED jest włączone”. Dodanie tej jednej linii do .htaccess rozwiązało obie błędne konfiguracje.


0

Uwaga, może być konieczne ponowne uruchomienie LAMP, Apache lub cokolwiek innego, czego używasz, aby to zadziałało. Przez chwilę szarpaliśmy nasze mózgi na tym, wydawało się, że nie miało to wpływu, dopóki usługi nie zostały ponownie uruchomione, prawdopodobnie z powodu buforowania witryny.


Nie. Dzieje się tak, ponieważ Apache musi ponownie załadować ustawienia PHP. Jest to AFAIK wykonywane tylko wtedy, gdy usługa jest uruchamiana.
svin83
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.