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ń ...


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!


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);

?>

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.


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


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.


6

Szukasz:

php -d error_reporting="E_ERROR | E_WARNING | E_PARSE"

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.


3

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


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.


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

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ą.


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


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.


0

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

<?php
if (!defined('MYCONST'))
    define('MYCONST', 'Weeha!');
?>

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ą.


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 .

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.