Простий спосіб налагодження програм на php

Я користуюся цим методом налагодження програм на мові програмування PHP вже років, мабуть, 10. І ще жодного разу він мене не підводив. Чому я вирішив поділитися цим способом з вами? Напевно тому, що боляче дивитися на новачків, які беруть звідкись код, або пишуть пристойну онучу самі, він (природно) не працює і вони починають хаотично змінювати все підряд, намагаючись якимось способом «намацати» те місце, де таїться помилка . Але це насправді складний шлях, який не завжди призводить до результату. Отже, ось що я пропоную.
Головне при налагодженні програм і пошуку «багів» - це терпіння і послідовність в діях. Якщо ви не будете дотримуватися покроковий алгоритм, то нічого не вийде, в результаті ви заплутаєтеся і ні до чого не прийдете.
Сам покроковий алгоритм зводиться до послідовної розстановці міток в програмі, оновленню сторінки і спостереження виведеної інформації в браузері. Найкраще почати все з однієї мітки.
Кожна мітка виглядає приблизно так
Інтерпретатор коду PHP, дійшовши до такої мітки зробить наступне: вивівши «1» в браузер, він негайно припинить виконання коду програми. Таким чином, ви дізнаєтеся, що виконання коду програми дійшло до цього місця, так як на екрані буде виведена одиничка і це буде останнє, що відобразиться в браузері. Немає нічого простішого, щоб дізнатися - чи доходить до цієї точки інтерпретатор.
Ви можете не ставити exit (), якщо абсолютно впевнені в тому, що код не оновлює сторінку після виведення (немає рефреша).
Подальші дії можуть бути наступними:
- Можна перемістити отладочную мітку за кодом нижче, щоб з'ясувати - чи доходить інтерпретатор до цієї точки коду. Дуже зручно, якщо вам треба з'ясувати факт спрацьовування if () або факт входу в метод / функцію.
- Можна виводити не "1", а щось на кшталт «# 1 #» і потім шукати його у вихідному коді HTML браузера, щоб не сплутати зневаджувальної зі звичайним висновком (наприклад, якщо сторінка має досить велику кількість інших одиниць).
- Можна ставити відразу кілька міток в різних точках коду відразу, але ці мітки неодмінно повинні бути різні і бажано послідовні. Наприклад, «# 1 #», «# 2 #», «# 3 #» і так далі. Так ви побачите в браузері все мітки, до яких дійшов інтерпретатор і зможете зрозуміти логіку, яка в програмі спрацювала.
Загальне правило: просувайтеся по коду дуже повільно, намагаючись не пропустити того моменту, де таїться баг. Намагайтеся частіше використовувати метод половинного ділення.
Висновок значень змінних
Але який сенс від того, що інтерпретатор дійшов або не дійшов до якогось місця? Малоинформативно. Давайте додамо більше життя!
Часто необхідно вивести значення конкретних змінних в конкретній точці коду. І тут нам знадобляться дві найпотужніші функції - print_r () і var_dump (). Ось як їх можна використовувати.
Для того, щоб побачити вміст змінної, використовуємо print_r ($ var); або print_r ($ obj-> var) якщо потрібно подивитися вміст властивості конкретного об'єкта. Для того, щоб побачити значення true або false, використовуємо var_dump (). Тут необхідно пояснити дещо. Функція print_r () спеціально була придумана для того, щоб красиво виводити значення різних типів. Причому вона виводить і цілі, і рядки, і масиви і навіть об'єкти. А ось true і false вона не виводить, тобто висновок завжди буде дорівнює порожній рядку. Тут на допомогу приходить var_dump (), який виводить точне значення і тип цього значення.
Використовувати var_dump () скрізь я не рекомендую. Висновок, їм генерується, виглядає набагато заплутаніше, ніж висновок від print_r ().
Разом, ось як буде виглядати наша інформативна мітка:
Зазвичай я дублюю номер мітки в обрамленні інших символів, щоб бачити, де закінчився висновок тестованих змінних. Це часто буває корисно.
Можна ще перед кожним print_r () виводити echo «var ="; щоб розуміти де і чиє значення відображається.
Замір часу виконання частини коду
Дуже часто при профайлінга (а ще частіше при пошуку «гальм» в коді) буває необхідно заміряти реальний час виконання конкретного шматка коду.
У PHP є чудова функція microtime (), яка повертає поточний час в мікросекундах. Якщо їй вказати параметр true, то вона буде повертати його у вигляді числа з плаваючою точкою, що нам і потрібно.
Ідея способу виміру часу виконання шматка коду зводиться до того, щоб запам'ятати поточний час перед початком цього шматка і порівняти його з поточним часом в кінці шматка. Тобто ось так:
При цьому після мітки ми побачимо час, витрачений на виконання коду в секундах. Часто ви будете бачити щось типу такого: 1.233433E-05, це інженерна форма записи дуже малих і дуже великих чисел. Можна привести її в нормальний вигляд, додавши функцію sprintf ():
Трохи більше коду, але зате ви будете бачити нормальні числа начебто 0.000012, тобто 12 мікросекунд.
Ось і все на сьогодні, завтра я напишу спеціальну статтю, в якій розповім про ще один спосіб налагодження з використанням вивантаження логу в файл (буває корисно, якщо не хочеться порушувати нормальну роботу сайту, тобто висновок різних міток на сторінку неприпустимий).