Налагодження PHP-скриптів
Як відомо, при виникненні помилки PHP в кращому випадку видає номер рядка, де вона сталася, і її короткий опис, а в гіршому (якщо в настройках хостингу відключений показ помилок взагалі) - просто порожню сторінку. Це не дуже зручно як для налагодження, так і для кінцевого користувача. Виникає питання: як зробити висновок повідомлення про помилку більш інформативним.
Виявляється, все досить просто. У PHP існує спеціальна функція set_error_handler (), яка дозволяє задати свій власний обробник ошібок.Едінственний її параметр - це ім'я функції-обробника, яка викликається в разі виникнення помилки. Функція-обробник має 4 параметри: номер помилки, текст помилки, ім'я файлу, в якому помилка сталася і номер рядка в цьому файлі.
Але цих даних може бути недостатньо. Часто потрібно вивести і весь стек викликів, щоб зрозуміти, де саме сталася помилка. Отримати стек визвов можна за допомогою функції debug_backtrace, яка повертає масив зворотних викликів. Кожен елемент цього масиву є хешем з наступними полями: function - ім'я функції, args - аргументи функції, file - ім'я файлу скрипта, в якому вона була викликана. line - номер рядка, де був виконаний виклик функції.
Увага: в ряді випадків file і line бувають не задані, завжди перевіряйте їх (та й взагалі будь-які індекси масиву) за допомогою isset, а константи - за допомогою defined, інакше виникне рекурсивний виклик обробника помилок. Крім того, якщо зробити висновок аргументів функцій, потрібно вжити заходів, щоб не видавався пароль від бази даних в тому випадку, якщо помилка виникне на етапі підключення до СУБД (тобто при виконанні функції mysql_connect або їй подібною). Найпростіший варіант - замінювати його за допомогою str_replace на зірочки або інші спецсимволи перед виведенням.
Розглянемо приклад функції-обробника:
Також часто при налагодженні скриптів потрібно вивести значення будь-якої змінної, щоб зрозуміти, на якому етапі беруться неправильні дані. Використання для цього print_r - не найкраще рішення (особливо при налагодженні на живому сайті), так як значення може вивестися в невідповідному місці (наприклад, якщо використовується шаблонизатор, то ще до HTML-заголовка). Крім того, Коректніша рішення - запам'ятати значення в отладочную змінну, яку вивести потім там, де її поява не заважатиме (наприклад, в підвалі сайту).
Я для цих цілей використовую таку функцію:
Ця функція екранує всі передані в неї параметри і запам'ятовує в глобальну змінну $ GLOBALS [ 'IntBF_debug'], звідки Ви зможете вивести в будь-якому зручному місці за допомогою звичайного echo.
Якщо потрібно перервати виконання скрипта з помилкою з ініціативи розробника (наприклад, після помилкового SQL-запиту), слід використовувати функцію trigger_error. У цій функції два параметри: перший - рядок з повідомленням про помилку, яка буде передана в параметр $ errstr обробника, а другий - код помилки, який може бути однією з трьох констант: E_USER_ERROR (приведе до завершення виконання), E_USER_WARNING, E_USER_NOTICE .
Використання цих функцій може допомогти значно заощадити чимало часу і зробити сайт більш дружелюбним до користувача. Але в той же час не слід забувати, що є ситуації, в яких цей обробник не спрацює, наприклад, при виклику неіснуючої функції або підключенні за допомогою require скрипта, що містить синтаксичну помилку.