Замолвим слово об отладке и профилировании [PHP]
Все идет от лени. Вы получили чужой очень большой проект в котором нужно сделать небольшие правки, или же написали скрипт и сразу не очевидно, что в нем еще требует оптимизации. Как быть? Читать и анализировать код, выводить каждый шаг на экран или в файл (var_dump () и т.д.) не всегда эффективно, ведь можно воспользоваться средствами отладки, которых на сегодняшний день очень много. Кратко перечислю часто встречающиеся…Xdebug Debugger and Profiler Tool — расширение PHP. Требует установки на сервер и настройки. Может отображать: стек вызовов функций, распределение памяти. Возможности: профайлинг, анализ покрытия кода, защита от бесконечной рекурсии, интерактивная отладка скриптов. ПО для визуализации логов xdebug: Webgrind — веб-интерфейс для профайлинга Xdebug, написанный на PHP, MacGDBp — Mac OS X клиент, который позволяет отлаживать PHP приложения при помощи Xdebug. Linux GUI kcachegrind. Бесплатный. Интегрируется с многими IDE. См Profiling PHP Applications With xdebug. При включении опции в php.ini: html_errors = On будет форматировать вывод var_dump () и сообщения об ошибках.Xhprof — расширение PHP от facebook. Требует установки на сервер и настройки. Позволяет собирать время выполнения каждой функции, использование памяти, время ожидания, количество вызовов и многое другое. Это расширение доступно из репозитория PECL. Почитать документацию можно тут [тыц]. Так же Профилирование и отладка php-приложений с помощью xhprof & FirePHP. Из преимуществ сильно не грузит систему, можно ставить на бой. Бесплатный.
DBG (PHP Debugger and Profiler) — расширение PHP. Требует установки на сервер и настройки. Позволяет работать на тестовом или/и рабочем сервере и отлаживать скрипты локально или удаленно, из IDE или консоли. Платная/бесплатная версии.
ZendDebug — расширение PHP, входит в состав Zend Studio (платная IDE). Требует установки на сервер и настройки. Позволяет практически все тоже, что и xdebug, GUI в IDE Zend Studio или Zend Server. Платный. Чуть ниже рассмотрим его более подробно.
Memtrack — расширение PHP. Позволяет искать утечки памяти. Удобно проверять скрипты запускаемые по крону или в качестве демона. Бесплатный. См. [тыц]
APD Advanced PHP debugger — расширение PHP. Слабый конкурент xdebug, но имеет в себе возможности memtrack. Плохо интегрируется с IDE, однако имеет консольный интерфейс (см. [тыц]). Бесплатный.
DTrace + PHP — расширение PHP. Низкоуровневая отладка. См. [тыц]. Так же не нужно забывать о существовании Strace и прочих системных отладчиков, которые порой способны показать где, так сказать, «собака порылась». Напримерstrace -p 1111анализ системных вызов скрипта, с PID=1111. Также сетевые анализаторы wireshark (Windows), ngrep, tcpdump (Linux) — для анализа сетевого трафика, протоколов и т.д.
FirePHP — класс, написан на php + расширение для FireFox. Дает возможность посылать отладочные сообщения в консоль Firebug с помощью вызова php методов. Вся информация посылается через заголовки X-FirePHP-Data, тем самым не пересекаясь с основным контентом страниц. Бесплатный. См. Отладка PHP средствами Firebug
PHP_Debug класс, написан на php. Помогает в отладке PHP кода, показывает путь выполнения скрипта, отображает все переменные, время выполнения, включенные файлы, выполненные запросы, watch переменные… Эта информация собирается во время выполнения скрипта, и отображается по его завершению и потом может быть использована в любой момент. Бесплатный.
Pinba — сервис мониторинга и статистики в реальном времени. СмМониторим php в реальном времениМониторинг производительности PHP-кода с помощью Pinba. Бесплатная.
Статьи общего характера: Профилирование PHP-кодаОтладка сложных веб-приложений — эффективная багодробилка на production-серверах
Отладчики в современных CMS/CMF/Framework. Их не рассматриваем, т.к. зачастую они имеют специфику и разработаны под конкретную оболочку, что делает не возможным использование их извне (IDE) или применять без значительных изменений в своих разработках.
Для сбора и анализа узких мест в ваших приложениях иногда может пригодится методика централизованного хранении syslog, см [тыц].
Вернемся к ZendDebug. Так как я в основном пользуюсь Zend Studio, то мне наиболее удобно с ним работать. Он позволяет сразу понять ход выполнения скрипта, поддерживает навигацию по коду из IDE. Не нужны никакие сторонние инструменты, кроме IDE. Это действительно удобно, так сказать настроил один раз и пользуешься.
Отладка и профилирование скриптов в Zend Studio возможна как минимум двумя способами при помощи xdebug или ZendDebug. Только вот профилирование сайта с xdebug у меня не заработало, пишет что нельзя так — только отладка.
Про локальную отладку кода писали еще во времена Zend Studio 5.5 [тыц]. С тех времен мало что изменилось. Но я столкнулся с проблемой, когда web сервер и отлаживаемый код находится на удаленном сервере. Часто такие песочницы закрыты извне, а отрыты только нужные для работы порты. Но если к такой песочнице есть доступ по SSH, то настроить ZendDebug все таки можно, не мешая фаерволу выполнять свою функцию.
Забегая вперед отмечу, что для этого нужно будет создать SSH туннель. Немного о том, зачем SSH туннель нужен в этом случае.
По умолчанию Zend Studio инициирует сеанс удаленной отладки, отправив HTTP запрос на отладочный сервер. Этот запрос содержит параметры обратного адреса (IP-адрес и номер порта), который ZendDebug (установленный на сервере) использует при запуске нового подключения к Zend Studio, чтобы ретранслировать информацию об отладке. Кстати, инициализировать сам сеанс отладки можно как из IDE, так и из браузера установив компонент, поставляемый вместе с Zend Studio, будет довольно удобно.
Обычная отладочная сессия будет иметь место, например, в случае, когда код, WEB сервер и IDE находятся на локальном компьютере.
Но зачастую WEB сервер разделен с IDE брандмауэрами, маршрутизаторами, прокси-серверами т.д. Тут-то и пригодится SSH туннель.
В случае с туннелем процесс установления сеанса отладки состоит из двух основных этапов: — создания SSH туннеля; — настройки Zend Debugger, для передачи своего трафика через SSH туннель.
Схема отладочной сессии через SSH туннель примет вид: Обычная отладочная сессия через SSH туннель
Zend Studio, по умолчанию, открывает порт 10137. Его и будем использовать в примерах далее. Можно назначить и другой порт, если это необходимо.
Создание SSH туннеля в Linux или Mac OS X можно в командной строке: ssh <порт Zend Studio >:127.0.0.1: <порт для открытия debug server> @пример:
user@workstation:~> ssh -R 10137:127.0.0.1:10137 user@debugserver
user@debugserver’s password:
Со стороны IDE проверьте, что слушаются порт 10137 и локальный IP адрес 127.0.0.1
Практика тенулирования трафика вам может пригодится и для других целей. Например локальными утилитами делать SQL-дампы СУБД, когда удаленная база разрешает соединение только с 127.0.0.1 и т.д.
Думаю из списка выше каждый сможет найти себе удобный инструмент на каждый день. И что бы разработка приносила еще больше удовольствия, а на вопрос — «Что случилось? Почему лежим?», был всегда оперативный ответ.
Приятной отладки и скриптов без ошибок, спасибо за внимание.