Як вимкнути сповіщення 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.