Как отключить уведомления PHP?

126
Notice: Constant DIR_FS_CATALOG already defined

Я уже закомментирован display_errorsв php.ini, но не работаю.

Как заставить PHP не выводить такие вещи в браузеры?

ОБНОВИТЬ

Я положил display_errors = Offтуда, но он до сих пор сообщает о таких уведомлениях,

Это проблема с PHP 5.3?

Сообщение о большом количестве вызовов тоже.

user198729
источник
3
Если вы используете Apache, возможно, вам придется перезагрузить сервер! Если вы используете XAMPP, просто выберите «перезапустить» в приложении менеджера.
st4wik
2
Я предлагаю запустить, grep display_errors /path/to/php.iniчтобы увидеть, не переопределяется ли ваша строка где-нибудь в файле. Вот что со мной происходило.
usandfriends
Error_reporting - это решение
Дэвид Стиенен
попробуйте ini_set('display_errors',0)в своем файле php. Когда ваши ini-настройки не работают, вы должны проверить, phpinfo()отображается ли желаемое значение. В противном случае вы либо изменили неправильный ini-файл, либо что-то перезаписывает ваши значения из php.ini
Radon8472
это не ошибка php 5.3. display_errors работает с php 4.0.3 до последних версий @see 3v4l.org/87gIl
Radon8472

Ответы:

78

Вы можете установить display_errorsна 0или использовать error_reporting()функцию.

Однако уведомления раздражают (я могу отчасти посочувствовать ), но они служат цели. Вы не должны определять константу дважды, второй раз не сработает, и константа останется неизменной!

Пекка
источник
4
+1: Я одобряю упоминание о том, что он должен исправлять ошибки, а не отключать отчетность. И вы сделали это мягче, чем @Jonathan Kuhn :-)
Джош
1
Нет, похоже, это ошибка php5.3, display_errorsработает не так, как ожидалось.
user198729
@user попробуйте phpinfo()проверить, действительно ли применяется настройка. Простите, но я сильно сомневаюсь, что вы нашли ошибку в PHP 5.3 - я поверю, только когда увижу ее :)
Пекка
Странно, local valuemaster value
включен
1
@user Я думаю, что локальное значение может быть получено из ini_setдиректив или php_ini_flagнастроек в .htaccessфайлах.
Пекка
242

Из документации PHP ( error_reporting ):

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

Другие интересные варианты этой функции:

<?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
источник
Очень полезно и дает ответ на вопрос. Хотя я знаю, что все уведомления тоже лучше исправить. Иногда бывает удобно отображать все, кроме уведомлений.
Timo002 07
3
Отключение только уведомлений не помогло мне использовать ^ NOTICE, как указано в вышеупомянутом сообщении. Для PHP v5.3 используйте: E_ALL & ~ E_NOTICE
Chizzle
Если у вас есть REST API, возвращающий JSON или XML или что-то еще, вы можете отключить их. Или, по крайней мере, преобразовать их в исключения и обработать их соответствующим образом.
TheRealChx101
Привет. Работал у меня. Большое спасибо.
Х. Фарид
Display_errors контролирует отправку ошибок на стандартный вывод. Но когда вы меняете error_reporting на 0, вы полностью отключаете всю обработку ошибок и регистрацию ошибок ... НИКОГДА не делайте error_reporting (0).
Radon8472
30

Для командной строки php установите

error_reporting = E_ALL & ~E_NOTICE

в /etc/php5/cli/php.ini

phpвыполнение команды затем пропускает уведомления.

Пол Зальбер
источник
Сделав это error_reporting = E_ALL & ~ E_NOTICE & ~ E_WARNING в php.ini. Он отключает уведомление PHP и предупреждения PHP. Чтобы в браузерах не
отображалось
Это касается настроек php консоли. Если вы используете php для создания веб-страниц через файл конфигурации веб-сервера apache2, это /etc/php5/apache2/php.ini. Лучше всего использовать phpinfo (), чтобы узнать, какой файл конфигурации действительно используется.
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);

?>

источник http://php.net/manual/en/function.error-reporting.php

Абхишек Гоэль
источник
2
Разве это не просто дубликат существующего ответа, опубликованного много лет назад?
Панг
Мы оба скопировали из документации php, и в обоих ответах упоминались ресурсы.
Abhishek Goel
@AbhishekGoel Единороги - это замаскированные пони, это утверждение не имеет значения, вы все равно продублировали уже существующий ответ четыре года спустя.
Рики Бойс
@RickyB Я не проверял существующий ответ и не копировал.
Abhishek Goel
12

Использовал эту строку в вашем коде

error_reporting(E_ALL ^ E_NOTICE);  

Я думаю, это вам поможет.

Вики Махале
источник
6

Ты ищешь:

php -d error_reporting="E_ERROR | E_WARNING | E_PARSE"
Кристиан Тисмер
источник
2
Привет, @Christian, и добро пожаловать в StackOverflow! В будущем было бы здорово, если бы вы могли добавить немного дополнительных пояснений / деталей к своему ответу, чтобы просветить тех, кто видит его, относительно того, почему / как работает решение / устраняет проблему. Большое спасибо и
удачного
1
именно! Я использую /usr/bin/php -d error_reporting="E_ERROR | E_WARNING | E_PARSE" -f /path/to/file.phpдля своего crontab
vladkras
4

Я предпочитаю не устанавливать error_reportingвнутри моего кода. Но в одном случае с устаревшим продуктом существует так много уведомлений, что их необходимо скрыть.

Поэтому я использовал следующий фрагмент, чтобы установить значение, настроенное на стороне сервера, error_reportingно вычесть E_NOTICEs.

error_reporting(error_reporting() & ~E_NOTICE);

Теперь настройку отчетов об ошибках можно дополнительно настроить в php.iniили .htaccess. Только уведомления всегда будут отключены.

Algorhythm
источник
3

Вы можете установить ini_set('display_errors',0);в своем скрипте или определить, какие ошибки вы хотите отображать error_reporting().

Йерун
источник
Мне нужно было использовать ini_setметод, упомянутый здесь, error_reporting(0)метод, упомянутый в другом месте, не имел никакого эффекта.
пикс
2

не вызывая ошибок:

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

Если вам действительно нужно, измените отчет об ошибках с помощью error_reporting () на E_ALL ^ ​​E_NOTICE.

Джонатан Кун
источник
1
Если это производственный сайт, независимо от того, считаете ли вы его безошибочным или нет, вам все равно не следует отображать ошибки, если они возникают, поэтому «не вызывая ошибок» кажется дерзким ответом на правильный вопрос.
Кэм,
5
с каких пор можно допускать ошибки на рабочем сайте? Я согласен с тем, что на рабочем сайте не следует отображать ошибки, я не об этом говорил. Я говорил, что вы должны проверить, определена ли константа, и установить ее, если нет (вот почему я привел пример кода).
Джонатан Кун
Хотя ваш ответ не был "самым приятным", он, кажется, полностью отвечает на вопрос ОП. +1 к вашему ответу и / желаю, чтобы он был отмечен как ответ, поскольку это правильный ответ.
Наска
@Nazca Да, с тех пор я изменил свое поведение и стараюсь быть более дружелюбным. :)
Джонатан Кун
2

Для кода PHP:

<?php
error_reporting(E_ALL & ~E_NOTICE);

Для php.iniконфигурации:

error_reporting = E_ALL & ~E_NOTICE
Наби КАЗ
источник
1

Я обнаружил этот трюк недавно. Ударьте @ в начале строки, которая может вызвать предупреждение / ошибку.

Как по волшебству они исчезают.

DrLazer
источник
21
Обычно это плохая идея, все равно что вставлять беруши, потому что ваша машина издает ужасный скрежет.
Дэвид Морроу,
10
Это действительно имеет смысл для некоторых случаев, например, при рендеринге переменной независимо от того, установлена ​​она или пуста.
Frans
1
Это имеет смысл только тогда, когда у вас есть что-то вроде плагина WordPress, который автор еще не обновил, и вы точно знаете, что вызывает проблему. Но это пластырь, а не исправление.
Императив
Мне нравятся как error_reporting (), так и '@'. Я не знал ни об одном из них. Спасибо. Мне нравится "@", поскольку он обеспечивает те же функции, что и error_reporting (0), и его легче вводить. Если проблема больше похожа на «вешалку, задерживающую выхлоп», чем на «ужасный скрежет», то она позволяет проекту двигаться дальше. Я легко могу найти и исправить их, когда будет время. Это помогло решить проблему, при которой ошибка вызвана чтением данных из файла, поэтому никаких опечаток или проблем с библиотекой нет.
Марк Лонгмайр
1
Просто убедитесь, что вы поместили @ там, где вы на 100% уверены, что делаете.
Ник
1

Используйте phpinfo () и найдите, Configuration File (php.ini) Pathчтобы узнать, какой путь к файлу конфигурации для php используется. PHP может иметь несколько файлов конфигурации в зависимости от среды, в которой он запущен. Обычно для консоли это:

/etc/php5/cli/php.ini

а для php, запущенного apache, это:

/etc/php5/apache2/php.ini

А затем настройте error_reportingтак, как вам нужно:

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

MilanG
источник
1

Как упоминалось некоторыми, и если вы являетесь автором кода, вам следует исправить все эти ошибки, уведомления и т. Д., Потому что это вызовет у вас больше проблем в долгосрочной перспективе, чем их отсутствие (особенно при обновлении ОС). Для вашего сервера ошибки должны отображаться только в ваших журналах, а не на экране клиента.

Итак, чтобы избежать ошибок в вашем браузере, вы используете тот display_errorsфлаг, который вы уже нашли:

display_errors = Off

Теперь настоящая проблема заключается в том, что вы запускаете чужой код. В этом случае изменение кода, вероятно, будет перезаписываться каждый раз, когда вы обновляете этот код. Поддерживать этот код утомительно.

В моем случае я запускаю PHP, crontabчтобы wp-cron.phpсценарий работал время от времени. Мне присылали сообщения об ошибках, что становится утомительным, если вы получаете одно письмо каждые 10 минут! В этом случае, однако, в системе Wordpress есть файл конфигурации, включающий a, WP_DEBUGи они вызывают error_reporting()функцию, поэтому попытка изменить error_reportingпеременную в командной строке не сработает. Вместо этого вам нужно отредактировать wp-config.phpфайл в корневой папке и убедиться, что для WP_DEBUGнего установлено значение false. В противном случае вы будете постоянно получать все эти предупреждения и уведомления.

Алексис Вилке
источник
0

Вы можете проверить, определена ли уже константа, используя:

<?php
if (!defined('MYCONST'))
    define('MYCONST', 'Weeha!');
?>
Тьяго Белем
источник
0

Я считаю, что комментирование display_errors в php.ini не сработает, потому что по умолчанию включено. Вместо этого вы должны установить для него значение «Выкл.».

Не забудьте перезапустить Apache, чтобы применить изменения конфигурации.

Также обратите внимание, что, хотя вы можете установить display_errors во время выполнения, его изменение здесь не влияет на FATAL ошибки.

Как отмечали другие, в идеале во время разработки вы должны работать с error_reporting на максимально возможном уровне и с включенным display_errors. Эти ошибки, предупреждения, уведомления и строгие советы по кодированию, хотя и раздражающие, когда вы только начинаете, складываются и позволяют вам стать лучшим программистом.

AllenJB
источник
0

Двойные константы

Чтобы исправить конкретную ошибку здесь, вы можете проверить, определена ли уже константа, прежде чем определять ее:

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

Я бы лично начал с поиска константы в кодовой базе DIR_FS_CATALOG, а затем заменил бы двойное определение этим.

Скрытие встроенных уведомлений PHP в каждом конкретном случае

PHP предоставляет @оператор контроля ошибок, который можно использовать для игнорирования определенных функций, вызывающих уведомления или предупреждения.

Используя это, вы можете игнорировать / отключать уведомления и предупреждения в каждом конкретном случае в вашем коде, что может быть полезно в ситуациях, когда ошибка или уведомление являются преднамеренными, запланированными или просто раздражающими и не могут быть устранены в источнике , Поместите @перед функцией или переменной, вызывающей уведомление, и оно будет проигнорировано.

Вот пример:

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

Подробнее об этом можно найти в документации PHP по операторам управления ошибками .

Кевин Лири
источник