Чим нам може допомогти PHP при налагодженні скриптів?
Але, як показує практика, для розробників адміністратори передбачають перевизначення багатьох параметрів.
Що ж робити, коли у Вас замість сайту виникає білий аркуш, для початку давайте включимо відображення помилок: додайте наступні рядки в початок скрипта, що вимагає налагодження.
Примітка. підхід актуальний для повного перехоплення навіть критичних помилок при налагодженні в PHP версії, яка дорівнює або вище 5.2. В іншому випадку зверніть увагу на цю частину статті.
Розберемо наведений вище PHP код:
(String) ini_set ($ server_var_name, $ server_var_value) - встановлює значення $ server_var_value для змінної середовища виконання PHP $ server_var_name. в разі вдалого присвоєння повертає значення змінної, інакше повертає false.
Для початку ми включаємо відображення помилок ini_set ( "display_errors", 1).
Після цього ми встановлюємо значення для виведення помилок "error_reporting", E_ALL
E_NOTICE. рівне відображення всіх помилок, але без підказок E_NOTICE.
Потім ми переобумовленої висновок помилок в стандартний потік браузера відвідувача ini_set ( "error_log", ""); .
Все б добре, але є певні критичні помилки, пов'язані з роботою самого інтерпретатора, які можуть викликати переривання в роботі скрипта, і не будуть виведені в потік оглядача відвідувача. Ось такий загадковий він наш PHP.
Але, благо, з версії 5.2 (о диво!), Заявлена ще в php 4, функція - перехоплювач register_shutdown_function заробила !.
Опис функції register_shutdown_function:
(Void) register_shutdown_function (callback $ function) - приймає ім'я функції $ function. яка виконується по завершенню виконання коду, навіть під час виникнення критичної помилки з перериванням роботи скрипта.
Визначимо функцію errPrint. яка роздрукує останню помилку print_r (error_get_last ()) після завершення скрипта. І передамо назву цієї функції обробника register_shutdown_function:
Опис функції error_get_last:
(Array) error_get_last (void) - повертає у вигляді масиву інформацію про останню сталася помилку. Масив містить ключі "type" - тип помилки, "message" - докладне повідомлення про помилку, "file" - шлях до файлу, в якому сталася помилка, "line" - номер рядка, в якій сталася помилка і номер символу.
А в нашому випадку, остання «трапилася» помилка - і є та сама, яка призводить до зупинки виконання скрипта.
Завдяки такому підходу можна буде «відловити» буквально будь-яку помилку і отримати детальну інформацію про неї.
Не забувайте відключати інформацію про виведення помилок в браузер користувача!
Але, після налагодження php скрипта і усунення критичної помилки, не забувайте відключити повністю інформацію про виведення помилок в браузер користувача. Пов'язано це як з міркуваннями безпеки (багато помилок і попередження можуть доступною для зловмисника конфіденційну інформацію, наприклад: про абсолютне шляху на сервері до Ваших скриптів, їх місцезнаходження і т.п.), а так само можуть перешкоджати нормальній ініціалізації сесій і роботи функцій, передавальних заголовки header, так і з естетичної точки зору не варто виводити багато малозрозумілою інформації в браузер відвідувача Вашого сайту. Для цього можна придушити повністю висновок помилок. Або ж перевизначити висновок помилок в файл за допомогою функції ini_set ( "error_log", "шлях до файлу помилок, доступному на запис") ;. При цьому бажано, щоб цей файл знаходився поза папок вашого сайту, або доступ до файлу ззовні був повністю обмежений.
Наведемо код повного придушення помилок:
Так само для деяких функцій, які все одно генерують помилки і попередження, можна використовувати оператор придушення помилок. Для цього достатньо перед ім'ям функції вказати: @. наприклад:
Хоча, настійно рекомендую Вам замість цього «ледачого» способу за допомогою умовних операторів обробити всі ситуації, які призводять до появи цієї помилки. Це додасть стабільності і збільшить «запас міцності» Ваших скриптів під час виникнення позаштатних ситуацій, і залишить менше «грунту для роздумів» зловмисникам.
Пам'ятайте. уважна і скрупульозна розробка сайтів ціна вашій репутації!
Я все одно бачу білу сторінку!
Тут може бути кілька причин:
Даний підхід універсальний для php 5.2 і вище. Для того, щоб дізнатися версію Вашого PHP інтерпретатора, додайте в Ваш скрипт виклик функції phpinfo ();
У перших рядках буде описана версія PHP.
Якщо версія php нижче 5.2:
Для більш ранніх версій php Дмитром Котеровим було розроблено гнучке рішення з перехоплення критичних помилок, з ним Ви можете ознайомитися тут
Якщо у Вас версія PHP вище 5.2, але біла сторінка все таки продовжує з'являтися з налаштованим висновком помилок, значить Ваш скрипт автоматично завершується сервером (Ви перевищуєте ресурси процесорного часу, відбувається не обробляється критична ситуація в одній з бібліотек PHP і т.п.). В даному випадку раджу Вам звернутися до хостера за наданням логів помилок і навантаження.
Але якщо Ви не знайшли нічого корисного і в балках, наданих хостером - сама остання інстанція: покрокова налагодження за допомогою функцій примусової зупинки exit або die в «проблемних місцях» і роздруківкою потрібної інформації виявити «нестійкий код», і переписати його з урахуванням меншого навантаження .
Наведемо приклад виконання покрокової налагодження з простою установкою прапорів станів:
Якщо ж Ви побачили білий аркуш раніше відображення «закінчення роботи функції add_user_avatar», значить проблему варто шукати саме в ході виконання даної функції add_user_avatar. Якщо ж ні, ми «пересуваємо» функцію die або exit нижче, позначаючи виклик і завершення далі наступних функцій подібним способом.
Більше інформації про веб технологіях можна дізнатися з нашого переліку всіх статей на сайті: