Як увімкнути або вимкнути відображення помилок у PHP? Попередні повідомлення про помилки

Невід'ємною частиною програмування є виявлення помилок у коді. Будь програміст хоч сім п'ядей на лобі, все одно, він буде робити помилки, іноді навіть банальні. Цьому сприяє сама природа людини. Тому за налагодженням та виявленням помилок у коді програміст проводить досить велику частину часу. Відповідно, чим гнучкіше і зручніше існують інструменти виявлення помилок у коді, і що краще програміст ними володіє, - тим вище його продуктивність.

Оскільки PHP є скриптовою мовою програмування, всі помилки, допущені в коді, виявляються по ходу виконання коду. Програміст PHP має зіштовхуватися як зі стандартними помилками, властивими програмуванню в цілому, так і з досить прихованими помилками - такими як помилки в іменуванні змінних.

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

Стандартний механізм помилок PHP досить простий - якщо в процесі виконання сценарію інтерпретатор PHP стикається з будь-якою помилкою - він намагається повідомити про це програміста. Однак налаштувань цього механізму передбачено досить багато, тому розібратися в них програмісту, який пізнає PHP, досить складно.

Бачимо помилки

Так, для того, щоб PHP відображав помилки прямо на сторінці, необхідно встановити спеціальний параметр у коді:

ini_set("display_errors", 1); //display_errors відповідає за відображення помилок прямо на сторінці. Якщо 0 – помилки не відображаються

Тепер, у разі виникнення будь-якої помилки в скрипті, інтерпретатор виведе інформацію про неї на сторінці. Наприклад, якщо запустити скрипт з неіснуючою функцією:

ini_set("display_errors", 1);
echo "

Рядок, який буде відображено

";
echo abrakadabra();
echo "

Рядок, який не буде відображено через помилку

";

то на сторінці з'явиться така помилка:

Фатальна помилка. Така помилка означає, що скрипт перериває свою роботу, і далі код, що йде, не буде виконаний.

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

Взагалі, PHP є помилки різних категорій значущості: деякі з них переривають подальше виконання коду - інші ні, одні можна перехоплювати - інші не можна. Повний перелік категорій помилок наведено нижче:

Значення
Константа
Опис
Можливість
1
E_ERROR
Непереборна помилка
Ні
2
E_WARNING
Виправна помилка
Так
4
E_PARSE
Помилка парсера
Ні
8
E_NOTICE
Потенційна помилка
Так
16
E_CORE_ERROR
Аналогічно E_ERROR, але генерується ядром PHP
Ні
32
E_CORE_WARNING
Аналогічно E_WARNING, але генерується ядром PHPНі
64
E_COMPILE_ERROR
Аналогічно E_ERROR, але генерується Zend Engine
Ні
128
E_COMPILE_WARNING
Аналогічно E_WARNING, але генерується Zend EngineНі
256
E_USER_ERROR
Аналогічно E_ERROR, але ініціюється викликом trigger_error()
Так
512
E_USER_WARNING
Аналогічно E_WARNING, але ініціюється викликом trigger_error()Так
1024
E_USER_NOTICE
Аналогічно E_NOTICE, але ініціюється викликом trigger_error()Так
2048
E_STRICT
Повідомлення від виконавчого середовища з рекомендаціями щодо покращення якості коду (починаючи з PHP5)
-
4096
E_RECOVERABLE_ERROR
Небезпечна, але не фатальна помилка (наприклад, невідповідність типу)
Так
8192
E_DEPRECATED
Попередження про використання застарілої функції або можливості
Так
16384
E_USER_DEPRECATED
Попередження про використання застарілої функції або можливості, ініційоване у коді
Так
32767
E_ALL
Усі помилки
Ні

Для зручності передбачені константи, що використовуються визначення рівня обробки помилок, побудови біт-маски. Константи мають імена, що "говорять". Дивлячись на константу - ми можемо сказати, що помилка рівня E_PARSE виникає у разі синтаксичної помилки, E_NOTICE - це нагадування програмісту про порушення "хорошого стилю" програмування на PHP.

За замовчуванням увімкнено значення режиму створення повідомлень про помилки E_ALL & ~E_NOTICE , що відповідає виведенню всіх повідомлень, що не належать до категорії E_NOTICE . Програміст може гнучко настроїти, які категорії помилок йому потрібно бачити на сторінці. Для того, щоб змінити режим створення помилок, необхідно змінити конфігураційний параметр error_reporting . Щоб увімкнути відображення будь-яких помилок, необхідно задати даним параметромзначення E_ALL:

Наприклад, якщо запустити наступний код:

ini_set("display_errors", 1);
ini_set("error_reporting", E_ALL);

Ми отримаємо помилки відразу двох категорій (notice та warning):

Коли використовується неоголошена змінна, з'являється помилка E_NOTICE . Коли з'єднання з базою даних MySQL (або інший) завершується невдачею - інтерпретатор PHP повідомляє про помилку рівня E_WARNING.

Логуємо помилки

Якщо навіть конфігураційний параметр display_errors встановлений в 0, все одно повинна бути можливість переглядати наявність помилок у процесі виконання скрипта. Таким чином, якщо трапиться помилка - ми повинні знати, де і чому вона трапилася. Для цих цілей у PHP існують налаштування логування помилок.

За промовчанням засобами мови PHP помилки ніде не логуються. Щоб це змінити, необхідно змінити параметр конфігурації log_errors в 1 з 0:

ini_set("log_errors", 1);

У такому разі помилки автоматично записуватимуться у файл, вказаний у конфігураційному параметрі error_log . Параметр error_log також можна змінити, вказавши шлях до бажаного файлу, куди записуватимуться помилки:

ini_set("error_log", "/var/log/php_errors.log");

Так, для коду:

ini_set("display_errors", 1);
ini_set("error_reporting", E_ALL);
ini_set("log_errors", 1);
ini_set("error_log", __DIR__ . "/log.txt");
$db = mysql_connect($db_host, "user", "password");

У лог-файл записується аналогічна інформація, яка виводиться на сторінку:

PHP Notice: Undefined variable: db_host в Z:\home\test\www\index.php on line 7
PHP Warning: mysql_connect(): Access denied for user "user"@"localhost" (using password: YES) in Z:\home\test\www\index.php on line 7

Обробляємо помилки

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

Щоб перехоплювати некритичні помилки в коді, достатньо реалізувати і оголосити власну функцію і передати її назву в функцію set_error_handler . При цьому, в реалізовану функціюпередаються 5 параметрів:

  • рівень помилки як цілого числа;
  • повідомлення про помилку у вигляді рядка;
  • ім'я файлу, у якому сталася помилка, як рядка;
  • номер рядка, у якому сталася помилка, у вигляді цілого числа;
  • масив усіх змінних, що у області видимості, де сталася помилка. Причому будуть включені також і глобальні змінні.
,

Висновок

PHP має потужні засоби обробки та управління стандартним поширенням помилок. Тому відловити ту чи іншу помилку не складе труднощів за умови, що скрипт грамотно налаштований. Знання цієї області є невід'ємними будь-якого PHP-програміста, оскільки безліч коду використовує описаний вище механізм


Часто чув таку проблему від інших користувачів. Одним з-за хостера потрібно приховати помилки, іншим навпаки - зрозуміти, що відбувається з їх кодом, тому що жодна помилка не показується. У цій статті намагатимусь показати всі основні способи відобразити / приховати помилки.

У скрипті PHP

1) У PHP є лише один оператор, який підтримує систему управління помилками - це знак @. Він дозволяє проігнорувати повідомлення будь-яке повідомлення про помилку. Його потрібно ставити перед виразом, який може її утримувати.

У прикладі спеціально допущено помилку, але вона НЕ буде відображена

$value = @$var[$key];
2) Також можна перед скриптом PHP, що перевіряється, можна вставити налаштування параметра відображення помилок ( display_errors). Він може набувати значення або On (показувати), або Off (приховати).

Ini_set("display_errors","On");
error_reporting("E_ALL");
І відповідно, після коду, який перевірявся на помилки, виставити параметр назад.

Ini_set("display_errors","Off");

Наприклад, Ви хочете побачити помилки у скрипті

Ini_set("display_errors", "On"); // Повідомлення з помилками будуть відображатися
error_reporting(E_ALL); // E_ALL - відображаємо ВСІ помилки
$value = $var[$key]; // приклад помилки
ini_set("display_errors", "Off"); // тепер повідомлень НЕ буде
Можна виставити навпаки (у верхньому off, а нижньому on), щоб у конкретному відрізку коду помилки НЕ відображалися.

У файлі.htaccess

Найчастіше проблему вирішують саме вказівкою налаштувань у файлі .htaccess, який знаходиться в кореневій директорії сайту. У рядку php_flag display_errors потрібно також виставити On або Off

Php_flag display_errors On
#показати всі помилки, крім попереджень (Notice)
php_value error_reporting "E_ALL & ~E_NOTICE"

У файлі php.ini

Як бачите, параметр можна вказати у кількох місцях. Однак, якщо у Ви хочете, щоб повністю на сайті цей параметр мав певне значення, то простіше виставити його у файлі php.ini.(До нього на хостингу не завжди може бути доступ), але в цьому випадку можна буде навіть обійти налаштування всього хостингу

В php.ini:

Error_reporting = E_ALL
display_errors On
В верхньому рядкувибираємо всі види помилок, у нижній даємо добро на їхнє відображення.

Після правок необхідно перезапустити Apache, щоб налаштування були змінені та набрали чинності (graceful або restart):

Sudo apachectl -k graceful

В якому порядку обробляється параметр помилок

На самому початку враховується параметр php.ini , потім.htaccess , а потім те, що зазначено безпосередньо в скрипті PHP. Так що якщо щось не спрацювало, то дивимося по ланцюжку вище, можливо, там інше налаштування.

Як завжди спасибі за увагу та удачі! Сподіваюся, стаття була корисна!

Я намагаюся розібрати HTML5-код, тому я можу встановити атрибути / значення коду, але, схоже, DOMDocument (PHP5.3) не підтримує теги, такі як

2021 wisemotors.ru. Як це працює. Залізо. Майнінг. Криптовалюта.