Замолвим слово об отладке и профилировании. Список полезных инструментов для php разработчика

  • Отладка
    • Tutorial

    Все идет от лени. Вы получили чужой очень большой проект в котором нужно сделать небольшие правки, или же написали скрипт и сразу не очевидно, что в нем еще требует оптимизации. Как быть? Читать и анализировать код, выводить каждый шаг на экран или в файл (var_dump() и т.д.) не всегда эффективно, ведь можно воспользоваться средствами отладки, которых на сегодняшний день очень много. Кратко перечислю часто встречающиеся…

    Xdebug Debugger and Profiler Tool - расширение PHP. Требует установки на сервер и настройки. Может отображать: стек вызовов функций, распределение памяти. Возможности: профайлинг, анализ покрытия кода, защита от бесконечной рекурсии, интерактивная отладка скриптов. ПО для визуализации логов xdebug: Webgrind – веб-интерфейс для профайлинга Xdebug, написанный на PHP, MacGDBp – Mac OS X клиент, который позволяет отлаживать PHP приложения при помощи Xdebug. Linux GUI . Бесплатный. Интегрируется с многими IDE. См . При включении опции в php.ini:

    Html_errors = On
    будет форматировать вывод var_dump() и сообщения об ошибках.

    Xhprof - расширение PHP от facebook. Требует установки на сервер и настройки. Позволяет собирать время выполнения каждой функции, использование памяти, время ожидания, количество вызовов и многое другое. Это расширение доступно из репозитория PECL . Почитать документацию можно тут [тыц] . Так же . Из преимуществ сильно не грузит систему, можно ставить на бой. Бесплатный.

    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 -p 1111
    анализ системных вызов скрипта, с PID=1111. Также сетевые анализаторы wireshark (Windows), ngrep , tcpdump (Linux) - для анализа сетевого трафика, протоколов и т.д.

    FirePHP - класс, написан на php + расширение для FireFox. Дает возможность посылать отладочные сообщения в консоль Firebug с помощью вызова php методов. Вся информация посылается через заголовки X-FirePHP-Data, тем самым не пересекаясь с основным контентом страниц. Бесплатный. См.

    php-console - написан на php + расширение для Google Chrome. Аналог FirePHP, только для Google Chrome, но несколько с другим функционалом. Бесплатный. См. php-console

    PHP_Debug класс, написан на php. Помогает в отладке PHP кода, показывает путь выполнения скрипта, отображает все переменные, время выполнения, включенные файлы, выполненные запросы, watch переменные… Эта информация собирается во время выполнения скрипта, и отображается по его завершению и потом может быть использована в любой момент. Бесплатный.

    Pinba - сервис мониторинга и статистики в реальном времени. См

    . Бесплатная.

    Отладчики в современных 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: Welcome to the Debug Server! user@debugserver:~$

    Для создания SSH туннеля в Microsoft Windows, можно использовать

    Начинается все, с вот такого милого сообщения от хостера клиенту, цитирую с некоторыми купюрами

    Здравствуйте!
    Домен newglas.ru заблокирован за рассылку спам сообщений.

    Спам рассылался скриптом r.php, выдержка из лога:

    98.130.0.219 – - "POST /r.php HTTP/1.0" 200 220 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)" 192.227.242.217 – - "POST /r.php HTTP/1.0" 200 207 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)" 200.57.147.120 – - "POST /r.php HTTP/1.0" 200 220 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; chromeframe; SLCC1)" 62.109.27.98 – - "POST /r.php HTTP/1.0" 200 212 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) Comodo_Dragon/4.0 Chrome/4.0 Safari/532.5"

    98.130.0.219 –- [ 15 / Jun / 2014 : 18 : 59 : 48 + 0400 ] "POST /r.php HTTP/1.0" 200 220 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"

    192.227.242.217 –- [ 15 / Jun / 2014 : 19 : 01 : 52 + 0400 ] "POST /r.php HTTP/1.0" 200 207 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"

    200.57.147.120 –- [ 15 / Jun / 2014 : 19 : 04 : 14 + 0400 ] "POST /r.php HTTP/1.0" 200 220 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; chromeframe; SLCC1)"

    62.109.27.98 –- [ 15 / Jun / 2014 : 19 : 06 : 06 + 0400 ] "POST /r.php HTTP/1.0" 200 212 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) Comodo_Dragon/4.0 Chrome/4.0 Safari/532.5"

    Кроме этого спам скрипта, антивирус нашел следующие зараженные файлы:

    httpdocs/images/images.php: PHP.Hide FOUND httpdocs/images/stories/im6207n6g.gif: PHP.Hide FOUND httpdocs/images/stories/im4566n9g.gif: PHP.Hide FOUND httpdocs/images/stories/im4760n2g.gif: PHP.Hide FOUND httpdocs/images/stories/muakero.php: PHP.Hide FOUND httpdocs/images/stories/im5617n0g.gif: PHP.Hide FOUND httpdocs/includes/domit/lo4754.php: Trojan.PHP-43 FOUND Для разблокировки, исправьте пожалуйста, проблему.

    httpdocs / images / images . php : PHP . Hide FOUND

    httpdocs / images / stories / im6207n6g . gif : PHP . Hide FOUND

    httpdocs / images / stories / im4566n9g . gif : PHP . Hide FOUND

    httpdocs / images / stories / im4760n2g . gif : PHP . Hide FOUND

    httpdocs / images / stories / muakero . php : PHP . Hide FOUND

    httpdocs / images / stories / im5617n0g . gif : PHP . Hide FOUND

    httpdocs / includes / domit / lo4754 . php : Trojan . PHP - 43 FOUND < em >

    Дляразблокировки, исправьтепожалуйста, проблему. < / em >

    Пошагово.
    1. Для поиска вирусов скачиваем мой .
    2. Распаковываем его в корень сайта.

    3. Просим хостера разблокировать сайт. Обычно хостер соглашается, если удалить файлы из письма. На время лечения важно заблокировать сайт для других. Чтобы остановить рассылку спама и прочие вредоносные функции.
    Я делаю это строчками в.htaccess

    Order deny,allow deny from all # Список IP через пробел, с которых доступ разрешен Allow from 188.88.88.88

    Где 188.88.88.88 — мой IP. Впрочем можно вписать и несколько айпи, например дать доступ клиенту.

    4. запускаем мой антивирусник по адресу. http://имя.сайта/fscure/
    При первом запуске скрипт составляет список файлов и проверяет подозрительные сигнатуры. Их список можно увидеть внизу. Сами сигнатуры можно настроить в config.php . Вот так обычно выглядит скрипт после запуска.

    Первое что нужно сделать после запуска, это настроить сортировку. Вирусы скорее всего попали на сайт последними. На скрине видно, что время модификации файлов меньше, чем время создания. Значит сортируем по времени создания.

    Файлы у которых подозрительные сигнатуры, например eval (base64_decode(проверяем кликая по ссылке.

    Вот так например выглядит зашифрованный Filesman PHP.shell , он же Trojan.PHP-43 , backdoor.php.phpshell . Кнопа "Удалить" поможет герою.

    Далее рутина, нужно проверять подряд все подозрительные файлы. С некоторым опытом, вы начнете угадывать по названию и сигнатрам наличие вируса. А пока придется смотреть код.
    Рутину можно сократить активно используя поиск. Найдя очередной вир, вобьем в поиск уникальную строку(сигнатуру) из тела вируса. Например "base64_decode($_POST "

    Нашлись три файла. Файлы маленькие, у 2-х размер совпадает. Поэтому достаточно проверить один из них и удалить все.
    Важно! Не забываем после удаления перегрузить список сканера .

    А вот прекрасное. Часто встречающиеся с картинки с однотипными названиями, например im4966n9g.gif. Смотрим исходный код "картинки" и видим.

    • Перевод

    PHP один из самых широко используемых языков для создания вебсайтов. PHP фреймворки, такие как Zend, CakePHP, CodeIgniter и т.д и open source классы и библиотеки упростили разработку.
    Независимо от того, являетесь ли вы опытным разработчиком или новичком, инструменты, которые вы используете, имеют прямое влияние на вашу продуктивность. Здесь собран список действительно полезных утилит и расширений для PHP разработчиков, которые помогут ускорить разработку, и улучшит итоговое качество кода.

    Тестирование

    PHPUnit
    PHPUnit является одним из семейства тестирующий фреймворков xUnit и упрощает написание тестов, так же как и их запуск и анализ результатов.

    SimpleTest это аналог JUnit/PHPUnit. Поддерживает mock объекты и может быть использован для автоматизации регрессионного тестирования веб приложений. Это возможно при помощи скриптабельного HTTP клиента, парсящего страницы и симулирующего такие вещи, как переход по ссылкам и отправка форм.
    vfsStream
    vfsStream это обертка для потоков файловой, полезная при юнит тестировании для создания mock объектов файловой системы. Можно использовать совместно с любым тестирующим фреймворком, например SimpleTest или PHPUnit.

    Непрерывная интеграция

    phpUnderControl
    phpUnderControl это аддон для системы автоматической сборки CruiseControl, который содержит некоторые из лучших средств разработки на PHP. Проект нацелен на то, чтобы первые шаги с PHP и CruiseControl были как можно проще. К phpUnderControl прилагается утилита для модификации существующей развернутой системы CruiseControl.
    Xinc
    Xinc это сервер непрерывной интеграции написанный на PHP 5. Имеется встроенная поддержка Subversion и Phing (то есть и PHPUnit), и может быть легко модифицирован для поддержки других систем контроля версий и билд систем.

    Cheat Sheets

    PHP Cheat Sheet от AddedBytes
    Одностраничный cheat sheet, перечисляющий аргументы для функций форматирования дат, синтаксис регулярных выражений и распространенные функции.
    PHP 5 Online Cheat Sheet
    Приведение типов: Boolean, Integer, String, Array, Object/Class; Строки: функции, обработка; Массивы: функции, обработка; Классы: объявление, объявление методов, видимость; Дата/Время: функции, форматы; Предопределённые переменные: $_SERVER, $_FILES