Jak wyłączyć powiadomienia PHP?

126
Notice: Constant DIR_FS_CATALOG already defined

Ja już wypowiedziało się display_errorsw php.ini, ale nie działa.

Jak sprawić, by PHP nie wyświetlało takich rzeczy w przeglądarkach?

AKTUALIZACJA

Umieściłem display_errors = Offtam, ale nadal zgłasza takie powiadomienia

Czy to problem z PHP 5.3?

Zgłaszanie również wielu stosów połączeń ...

user198729
źródło
3
Jeśli używasz Apache, może być konieczne ponowne uruchomienie serwera! Jeśli używasz XAMPP, po prostu wybierz „restart” w aplikacji menedżera.
st4wik
2
Proponuję uruchomić, grep display_errors /path/to/php.iniaby sprawdzić, czy gdzieś w pliku jest zastępowana linia. To właśnie się ze mną działo.
usandfriends
Rozwiązaniem jest raportowanie_błędów
David Stienen
spróbuj ini_set('display_errors',0)w swoim pliku php. Kiedy ini-settings nie działają, powinieneś sprawdzić, czy phpinfo()pokazuje żądaną wartość. Jeśli nie, albo zmieniłeś zły plik ini, albo coś nadpisuje twoje wartości z php.ini
Radon8472
nie jest to błąd php 5.3. display_errors działa od php 4.0.3 do najnowszych wersji @see 3v4l.org/87gIl
Radon8472

Odpowiedzi:

78

Można ustawić display_errorsdo 0lub używać error_reporting()funkcji.

Jednak powiadomienia są irytujące ( częściowo rozumiem ), ale służą celowi. Nie powinieneś definiować stałej dwa razy, drugi raz nie zadziała i stała pozostanie niezmieniona!

Pekka
źródło
4
+1: Popieram wzmiankę, że powinien poprawić błędy, a nie wyłączać raportowanie. I zrobiłeś to w delikatniejszy sposób niż @Jonathan Kuhn :-)
Josh
1
Nie, wygląda na to, że to błąd php5.3, display_errorsnie działa zgodnie z oczekiwaniami.
user198729
@user spróbuj, phpinfo()aby sprawdzić, czy to ustawienie faktycznie ma zastosowanie. Wybacz mi, ale mocno wątpię, czy znalazłeś błąd w PHP 5.3 - uwierzę tylko wtedy, gdy go zobaczę :)
Pekka
Dziwne, local valuejest master value
włączone
1
@user Myślę, że lokalna wartość może pochodzić z ini_setdyrektyw lub php_ini_flagustawień w .htaccessplikach.
Pekka
242

Z dokumentacji PHP ( error_reporting ):

<?php
// Turn off all error reporting
error_reporting(0);
?>

Inne ciekawe opcje tej funkcji:

<?php

// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// Reporting E_NOTICE can be good too (to report uninitialized
// variables or catch variable name misspellings ...)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

// Report all errors except E_NOTICE
// This is the default value set in php.ini
error_reporting(E_ALL & ~E_NOTICE);
// For PHP < 5.3 use: E_ALL ^ E_NOTICE

// Report all PHP errors (see changelog)
error_reporting(E_ALL);

// Report all PHP errors
error_reporting(-1);

// Same as error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);

?>
Cristian
źródło
Bardzo pomocny i daje odpowiedź na pytanie. Chociaż wiem, że lepiej też naprawić wszystkie powiadomienia. Czasami może być przydatne wyświetlenie wszystkiego oprócz powiadomień.
Timo002,
3
Wyłączanie samych powiadomień nie działało u mnie przy użyciu ^ UWAGA, jak podano w powyższym poście. Dla PHP v5.3 użyj: E_ALL & ~ E_NOTICE
Chizzle
Jeśli masz REST API zwracający JSON lub XML lub cokolwiek innego, możesz chcieć je wyłączyć. Lub przynajmniej przekształć je w wyjątki i odpowiednio z nimi postępuj.
TheRealChx101
Dzień dobry. Pracował dla mnie. Dziękuję Ci bardzo.
H. Farid
Display_errors kontroluje, czy błędy są wysyłane na stdoutput. Ale kiedy zmienisz error_reporting na 0, całkowicie wyłączasz obsługę błędów i obsługę błędów. NIGDY nie powinieneś robić error_reporting (0).
Radon8472
30

W przypadku php wiersza poleceń ustaw

error_reporting = E_ALL & ~E_NOTICE

w /etc/php5/cli/php.ini

phpwykonanie polecenia pomija powiadomienia.

Paul Salber
źródło
Robiąc to error_reporting = E_ALL & ~ E_NOTICE & ~ E_WARNING w pliku php.ini. Wyłącza Powiadomienie PHP i Ostrzeżenia PHP. Aby żadne powiadomienia php i ostrzeżenia php nie były widoczne w przeglądarkach
Deepak Lamichhane,
Dotyczy to ustawień konsoli PHP. Jeśli używasz php do generowania stron internetowych przez serwer WWW apache2, plik konfiguracyjny to /etc/php5/apache2/php.ini Najlepiej użyć phpinfo (), aby zobaczyć, jaki plik konfiguracyjny jest faktycznie używany.
MilanG
23
<?php

// Turn off all error reporting
error_reporting(0);

// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// Reporting E_NOTICE can be good too (to report uninitialized
// variables or catch variable name misspellings ...)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

// Report all errors except E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);

// Report all PHP errors (see changelog)
error_reporting(E_ALL);

// Report all PHP errors
error_reporting(-1);

// Same as error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);

?>

źródło http://php.net/manual/en/function.error-reporting.php

Abhishek Goel
źródło
2
Czy to nie jest tylko duplikat tej istniejącej odpowiedzi opublikowanej lata temu?
Pang
Oboje skopiowaliśmy wklejoną dokumentację php i obie odpowiedzi wspomniały o zasobach.
Abhishek Goel
@AbhishekGoel Unicorns to kucyki w przebraniu, to stwierdzenie nie ma znaczenia, po czterech latach nadal zduplikowałeś już istniejącą odpowiedź .
Ricky Boyce,
@RickyB Nie sprawdziłem istniejącej odpowiedzi ani nie skopiowałem.
Abhishek Goel
12

Użyto tego wiersza w Twoim kodzie

error_reporting(E_ALL ^ E_NOTICE);  

Myślę, że to dla ciebie piekło pełne.

vicky mahale
źródło
6

Szukasz:

php -d error_reporting="E_ERROR | E_WARNING | E_PARSE"
Christian Tismer
źródło
2
Cześć @Christian i witaj w StackOverflow! W przyszłości byłoby wspaniale, gdybyś mógł dodać trochę dodatkowych wyjaśnień / szczegółów do swojej odpowiedzi, aby wyjaśnić tym, którzy ją widzą, dlaczego / jak działa rozwiązanie / rozwiązuje problem. Wielkie dzięki i miłego kodowania :)
Zachary Kniebel,
1
dokładnie! Używam /usr/bin/php -d error_reporting="E_ERROR | E_WARNING | E_PARSE" -f /path/to/file.phpdo mojego crontab
vladkras
4

Wolę nie ustawiać error_reportingwewnętrznego kodu. Ale w jednym przypadku, starszego produktu, jest tak wiele powiadomień, że muszą być ukryte.

Więc użyłem następującego fragmentu kodu, aby ustawić wartość skonfigurowaną po stronie serwera, error_reportingale odjąć E_NOTICEs.

error_reporting(error_reporting() & ~E_NOTICE);

Teraz ustawienie raportowania błędów można dalej konfigurować w php.inilub .htaccess. Tylko powiadomienia będą zawsze wyłączone.

algorytm
źródło
3

Możesz ustawić ini_set('display_errors',0);w swoim skrypcie lub zdefiniować, które błędy mają być wyświetlane error_reporting().

jeroen
źródło
Musiałem użyć ini_setwspomnianej tutaj metody, error_reporting(0)metoda wspomniana w innym miejscu nie przyniosła żadnego efektu.
pix
2

nie powodując błędów:

defined('DIR_FS_CATALOG') || define('DIR_FS_CATALOG', 'whatever');

Jeśli naprawdę musisz, zmień raportowanie błędów za pomocą error_reporting () na E_ALL ^ ​​E_NOTICE.

Jonathan Kuhn
źródło
1
Jeśli jest to strona produkcyjna, niezależnie od tego, czy uważasz, że jest wolna od błędów, nadal nie powinieneś wyświetlać błędów, jeśli się pojawią - więc „nie powodując błędów” wydaje się nieco bezczelną odpowiedzią na ważne pytanie.
Cam
5
od kiedy można dopuszczać błędy w zakładzie produkcyjnym? Zgadzam się, że na stronie produkcyjnej nie powinieneś wyświetlać błędów, nie o tym mówiłem. Mówiłem, że powinieneś sprawdzić, czy stała jest zdefiniowana, a jeśli nie, ustawić ją (dlatego podałem przykład kodu).
Jonathan Kuhn
Chociaż Twoja odpowiedź nie była „najmilsza”, wydaje się, że odpowiada ona najpełniej na pytanie OP. +1 do Twojej odpowiedzi i / chciałbym, aby została oznaczona jako odpowiedź, ponieważ jest to poprawna odpowiedź.
Nazca
@Nazca Tak, od tego czasu zmieniłem swoje nastawienie i staram się być o wiele bardziej przyjacielski. :)
Jonathan Kuhn
2

Dla kodu PHP:

<?php
error_reporting(E_ALL & ~E_NOTICE);

Do php.inikonfiguracji:

error_reporting = E_ALL & ~E_NOTICE
Nabi KAZ
źródło
1

Niedawno znalazłem tę sztuczkę. Uderz @ na początku linii, co może spowodować ostrzeżenie / błąd.

Jak za dotknięciem czarodziejskiej różdżki znikają.

DrLazer
źródło
21
To zwykle kiepski pomysł, to tak, jakby wkładać zatyczki do uszu, ponieważ samochód wydaje okropny zgrzytliwy dźwięk.
David Morrow
10
W rzeczywistości ma to sens w niektórych przypadkach, na przykład podczas renderowania zmiennej, niezależnie od tego, czy jest ustawiona, czy pusta.
Frans
1
Ma to sens tylko wtedy, gdy masz coś takiego jak wtyczka WordPress, której autor jeszcze nie zaktualizował i wiesz dokładnie, co powoduje problem. Jest to jednak pomoc bandażowa, a nie poprawka.
Imperatywny
Podoba mi się zarówno error_reporting (), jak i „@”. Nie byłem świadomy żadnego z nich. Dziękuję Ci. Podoba mi się znak „@”, ponieważ zapewnia on taką samą funkcjonalność jak raportowanie błędów (0) i jest łatwiejszy do wpisania. Jeśli problem bardziej przypomina „wieszak podtrzymujący wydech” niż „okropny dźwięk zgrzytania”, to pozwala projektowi posunąć się naprzód. Mogę je łatwo znaleźć i naprawić, gdy jest na to czas. Pomogło to w rozwiązaniu problemu polegającego na tym, że błąd jest spowodowany odczytem danych z pliku, więc nie ma literówek ani problemów z biblioteką.
Mark Longmire
1
Po prostu upewnij się, że umieściłeś @ tam, gdzie jesteś w 100% pewien, co robisz.
Nick
1

Użyj phpinfo () i wyszukaj, Configuration File (php.ini) Pathaby zobaczyć, która ścieżka pliku konfiguracyjnego dla php jest używana. PHP może mieć wiele plików konfiguracyjnych w zależności od używanego środowiska. Zwykle dla konsoli jest to:

/etc/php5/cli/php.ini

a dla php uruchamianego przez Apache to:

/etc/php5/apache2/php.ini

A potem ustaw error_reportingtak, jak potrzebujesz:

http://www.phpknowhow.com/configuration/php-ini-error-settings/ http://www.zootemplate.com/news-updates/how-to-disable-notice-and-warning-in-phpini- plik

MilanG
źródło
1

Jak wspominali niektórzy, a jeśli jesteś autorem kodu, powinieneś poprawić wszystkie te błędy, powiadomienia itp., Ponieważ spowoduje to więcej problemów na dłuższą metę niż ich brak (zwłaszcza podczas aktualizacji systemu operacyjnego). W przypadku serwera błędy powinny być wyświetlane tylko w dziennikach, a nie na ekranie klienta.

Aby uniknąć błędów w przeglądarce, używasz display_errorsflagi, którą już znalazłeś:

display_errors = Off

Teraz prawdziwy problem występuje, gdy uruchamiasz kod kogoś innego. W takim przypadku modyfikacja kodu prawdopodobnie zostanie nadpisana za każdym razem, gdy aktualizujesz ten kod. Utrzymywanie tego kodu jest uciążliwe.

W moim przypadku używam PHP, crontababy wp-cron.phpskrypt był uruchamiany od czasu do czasu. Otrzymywałem błędy wysyłane na moje e-maile, co staje się uciążliwe, gdy otrzymujesz jeden e-mail co 10 minut! W takim przypadku jednak system Wordpress ma plik konfiguracyjny zawierający a WP_DEBUGi wywołują error_reporting()funkcję, więc próba zmiany error_reportingzmiennej w wierszu poleceń nie zadziała. Zamiast tego musisz edytować wp-config.phpplik w folderze głównym i upewnić się, że WP_DEBUGjest ustawiony na false. W przeciwnym razie przez cały czas będziesz otrzymywać wszystkie ostrzeżenia i powiadomienia.

Alexis Wilke
źródło
0

Możesz sprawdzić, czy stała jest już zdefiniowana za pomocą:

<?php
if (!defined('MYCONST'))
    define('MYCONST', 'Weeha!');
?>
Thiago Belem
źródło
0

Uważam, że wykomentowanie display_errors w php.ini nie zadziała, ponieważ domyślnie jest włączone. Zamiast tego musisz ustawić go na „Wył.”.

Nie zapomnij ponownie uruchomić Apache, aby zastosować zmiany w konfiguracji.

Zauważ również, że chociaż możesz ustawić display_errors w czasie wykonywania, zmiana go tutaj nie wpłynie na błędy KRYTYCZNE.

Jak zauważyli inni, najlepiej podczas programowania powinieneś uruchomić funkcję error_reporting na najwyższym możliwym poziomie i włączoną opcję display_errors. Choć denerwujące przy pierwszym uruchomieniu, te błędy, ostrzeżenia, powiadomienia i surowe porady dotyczące kodowania sumują się i pozwalają ci stać się lepszym programistą.

AllenJB
źródło
0

Podwójnie zdefiniowane stałe

Aby naprawić określony błąd, możesz sprawdzić, czy stała jest już zdefiniowana przed jej zdefiniowaniem:

if ( ! defined( 'DIR_FS_CATALOG' ) ) 
  define( 'DIR_FS_CATALOG', 'something...' );

Osobiście zacząłbym od wyszukiwania w bazie kodów dla stałej DIR_FS_CATALOG, a następnie zastąpiłbym podwójną definicję tym.

Ukrywanie powiadomień PHP w tekście, wielkość liter po kolei

PHP udostępnia @operator kontroli błędów, którego można używać do ignorowania określonych funkcji, które powodują powiadomienia lub ostrzeżenia.

Korzystając z tego, możesz zignorować / wyłączyć powiadomienia i ostrzeżenia w swoim kodzie dla każdego przypadku, co może być przydatne w sytuacjach, w których błąd lub powiadomienie jest celowe, zaplanowane lub po prostu irytujące i niemożliwe do rozwiązania u źródła . Umieść @znak przed funkcją lub zmienną, która powoduje powiadomienie, a zostanie zignorowana.

Oto przykład:

// Intentional file error
$missing_file = @file( 'non_existent_file' );

Więcej na ten temat można znaleźć w dokumentacji PHP Error Control Operators .

Kevin Leary
źródło