Як вимкнути сповіщення PHP?


126
Notice: Constant DIR_FS_CATALOG already defined

Я вже закоментований display_errorsв php.ini, але не працюю.

Як зробити так, щоб PHP не виводив такі речі в браузери?

ОНОВЛЕННЯ

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

Це проблема з PHP 5.3?

Повідомлення про численні стеки дзвінків також ..


3
Якщо ви використовуєте Apache, можливо, доведеться перезапустити сервер! Якщо ви використовуєте XAMPP, просто виберіть "перезапустити" у програмі менеджера.
st4wik

2
Я пропоную запустити, grep display_errors /path/to/php.iniщоб побачити, чи перекреслюється ваш рядок десь внизу файла. Це те, що зі мною відбувалося.
usandfriends

Error_reporting - це рішення
David Stienen

спробуйте 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 - я повірю в це лише тоді, коли побачу його :)
Pekka

Дивно, local valuemaster value
увімкнено

1
@user Я думаю, що локальне значення може походити від ini_setдиректив або php_ini_flagналаштувань у .htaccessфайлах.
Pekka

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

?>

Дуже корисно і дає відповідь на запитання. Хоча я знаю, що краще також виправити всі повідомлення. Іноді може бути зручно відображати все, окрім приміток.
Timo002

3
Відключення лише сповіщень не працювало для мене, використовуючи ^ NOTICE, як зазначено у вищезгаданому дописі. Для PHP v5.3 використовуйте: E_ALL & ~ E_NOTICE
Chizzle

Якщо у вас є REST API, що повертає JSON або XML або будь-яку іншу, ви можете вимкнути їх. Або принаймні перетворюйте їх на винятки та обробляйте їх відповідно.
TheRealChx101

Привіт. Працювали для мене. Велике спасибі.
Х. Фарид

Display_errors контролює, якщо помилки надсилаються до stdoutput. Але коли ви змінюєте 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
Deepak Lamichhane

Це стосується налаштувань 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 Я не перевірив існуючу відповідь і не копіював.
Абхішек Гоел

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. Лише повідомлення завжди будуть відключені.


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
Якщо це виробничий сайт, незалежно від того, чи не вважаєте ви його помилковим, ви все одно не повинні відображати помилки, якщо вони виникають - так "не спричиняючи помилок", схоже, трохи нахабною відповіддю на дійсне питання.
Cam

5
оскільки коли нормально допускати помилки на виробничому майданчику? Я погоджуюся, що на виробничому сайті ви не повинні відображати помилок, це не те, що я говорив. Я говорив, що ви повинні перевірити, чи визначена константа, і встановити її, якщо ні (саме тому я дав зразок коду).
Джонатан Кун

Хоча ваша відповідь не була "найприємнішою", здається, відповідаєте на питання ОП в повній мірі. +1 до вашої відповіді та / хочете, щоб вона була позначена як відповідь, бо це правильна відповідь.
Nazca

@Nazca Так, я з тих пір змінив свою поведінку і намагаюся бути набагато доброзичливішим. :)
Джонатан Кун

2

Для PHP-коду:

<?php
error_reporting(E_ALL & ~E_NOTICE);

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

error_reporting = E_ALL & ~E_NOTICE

1

Нещодавно я знайшов цю хитрість. Збийте @ на початку рядка, який може створити попередження / помилку.

Вони ніби за допомогою магії зникають.


21
звичайно, це погана ідея, це як введення вушних пробок, тому що ваш автомобіль видає жахливий шліфувальний шум.
Девід Морроу

10
Це насправді має ідеальний сенс для деяких випадків, наприклад, коли візуалізація змінної не має значення, встановлена ​​вона чи порожня.
Франс

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- файл


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.

Як зазначають інші, в ідеалі під час розробки слід працювати з повідомленнями про помилки на максимально можливому рівні та з включеними помилками display_errors. У той час, коли дратують, коли ви вперше починаєте, ці помилки, застереження, повідомлення та суворі поради з кодування все складаються та дають змогу стати кращим кодером.


0

Подвійні визначені константи

Щоб виправити конкретну помилку тут, ви можете перевірити, чи константа вже визначена перед її визначенням:

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

Я особисто розпочну з пошуку в кодовій базі константи DIR_FS_CATALOG, а потім замінюю подвійне визначення цим.

Приховування сповіщень PHP окремо, в кожному конкретному випадку

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

Використовуючи це, ви можете ігнорувати / відключати сповіщення та попередження у кожному коді, що може бути корисним у випадках, коли помилка чи повідомлення є навмисними, запланованими або просто набридливими і неможливо вирішити у джерелі . Поставте @перед функцією або var, яка викликає сповіщення, і вона буде проігнорована.

Ось приклад:

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

Більше про це можна знайти в документах операторів управління помилками PHP .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.