Отладка php


Содержание

Как и какими средствами находить ошибки в PHP коде?

При разработке, порой, код не работает так, как задумано или вообще не работает. Сижу, гадаю: что и где не так?

Час посмотрев на код — иду на проф. ресурсы, например Stack Overflow и публикую вопрос «Где здесь ошибка?» или «Почему не работает?»

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

Вопрос: какие есть способы, чтобы найти ошибки в PHP коде? Какие инструменты, методы, плагины, пути и пр.?

4 ответа 4

Вчера всё работало, а сегодня не работает / Код не работает как задумано

Debugging (Отладка)

В чем заключается процесс отладки? Что это такое?

Процесс отладки состоит в том, что мы останавливаем выполнения скрипта в любом месте, смотрим, что находится в переменных, в функциях, анализируем и переходим в другие места; ищем те места, где поведение отклоняется от правильного.

Будет рассмотрен пример с PHPStorm, но отладить код можно и в любой другой IDE.

Подготовка

Для начала необходимо, чтобы в PHP имелась библиотека для отладки под названием xdebug. Если её еще нет, то надо скачать на xdebug.org.

Обычно все библиотеки лежат в папке ext внутри папки PHP. Туда и надо поместить dll .

Далее в php.ini прописываем настройки:

Перезагружаем сервер, на всякий случай.

Теперь если в файле .php написать phpinfo(); то можно будет увидеть в самом низу такую картину:

  • нажимаем create project from existing files
  • выбираем Web server is installed locally, source files are located under its document root
  • выбираем папку с файлами, и нажав вверху кнопку «Project Root» помечаем папку как корень проекта
  • нажимаем «Next»

нажимаем Add new local server

  • вводим имя сервера любое и Web Server root URL . В рассматриваемом примере это http://localhost/testy2
    • нажимаем «Next» и затем «Finish»

    Запуск

    Для начала в левой части панели с кодом на любой строке можно кликнуть ЛКМ , тем самым поставив точку останова (breakpoint — брейкпойнт). Это то место, где отладчик автоматически остановит выполнение PHP, как только до него дойдёт. Количество breakpoint’ов не ограничено. Можно ставить везде и много.

    Если кликнуть ПКМ и во всплывающем меню выбрать Debug (или в верхнем меню — Run → Debug ), то при первом запуске PHPStorm попросит настроить интерпретатор. Т.е. надо выбрать версию PHP из папки, где он лежит, чтобы шторм знал, какую версию он будет отлаживать.

    Теперь можно нажать Debug .

    В данном случае, т.к. функция вызывается сразу на той же странице, то при нажатии кнопки Debug — отладчик моментально вызовет функцию, выполнение «заморозится» на первом же брейкпойнте. В ином случае, для активации требуется исполнить действие, при котором произойдет исполнение нужного участка кода (клик на кнопку, передача POST-запроса с формы с данными и другие действия).

    1. Стэк вызовов, все вложенные вызовы, которые привели к текущему месту кода.
    2. Переменные. На текущий момент строки ниже номера 3 ещё не выполнились, поэтому определена лишь $data
    3. Показывает текущие значения любых переменных и выражений. В любой момент здесь можно нажать на + , вписать имя любой переменной и посмотреть её значение в реальном времени. Например: $data или $nums[0] , а можно и $nums[i] и item[‘test’][‘data’][$name[5]][$info[$key[1]]] и т.д. На текущий момент строки ниже номера 3 ещё не выполнились, поэтому $sum и $output обозначены красным цветом с надписью «cannot evaluate expression».

    Процесс

    Для самого процесса используются элементы управления (см. изображение выше, выделено зеленым прямоугольником) и немного из дополнительно (см. изображение выше, выделено оранжевым прямоугольником).

    Show Execution Point ( Alt+F10 ) — переносит в файл и текущую линию отлаживаемого скрипта. Например, если файлов много, решили посмотреть что в других вкладках, а потом забыли где у вас отладка :)

    Step Over ( F8 ) — делает один шаг, не заходя внутрь функции. Т.е. если на текущей линии есть какая-то функция, а не просто переменная со значением, то при клике данной кнопки, отладчик не будет заходить внутрь неё.

    Step Into ( F7 ) — делает шаг. Но в отличие от предыдущей, если есть вложенный вызов (например функция), то заходит внутрь неё.

    Step Out ( Shift+F8 ) — выполняет команды до завершения текущей функции. Удобно, если случайно вошли во вложенный вызов и нужно быстро из него выйти, не завершая при этом отладку.

    Rerun ( Ctrl+F5 ) — перезапускает отладку.

    Resume Program( F9 ) — продолжает выполнение скрипта с текущего момента. Если больше нет других точек останова, то отладка заканчивается и скрипт продолжает работу. В ином случае работа прерывается на следующей точке останова.

    Stop ( Ctrl+F2 ) — завершает отладку.

    View Breakpoints ( Ctrl+Shift+F8 ) — просмотр всех установленных брейкпойнтов.

    Mute Breakpoints — отключает брейкпойнты.

    Итак, в текущем коде видно значение входного параметра:

    • $data = «23 24 11 18» — строка с данными через пробел
    • $nums = (4) [«23», «24», «11», «18»] — массив, который получился из входной переменной.

    Если нажмем F8 2 раза, то окажемся на строке 7; во вкладках Watches и Variables и в самой странице с кодом увидим, что переменная $sum была инициализирована и её значение равно 0.

    Если теперь нажмем F8 , то попадем внутрь цикла foreach и, нажимая теперь F8 , пока не окончится цикл, можно будет наблюдать на каждой итерации, как значения $num и $sum постоянно изменяются. Тем самым мы можем проследить шаг за шагом весь процесс изменения любых переменных и значений на любом этапе, который интересует.

    Дальнейшие нажатия F8 переместят линию кода на строки 11, 12 и, наконец, 15.

    Дополнительно

    Если нажать на View Breakpoints в левой панели, то можно не только посмотреть все брейкпойнты, но в появившемся окне можно еще более тонко настроить условие, при котором на данной отметке надо остановиться. В функции выше, например, нужно остановиться только когда $sum превысит значение 20.

    Это удобно, если останов нужен только при определённом значении, а не всегда (особенно в случае с циклами).

    Установка и настройка Xdebug

    Есть очень хороший инструмент для отладки php кода — Xdebug. Сегодня я расскажу как его развернуть на своей машине, а также как настроить NetBeans >

    Немного о Xdebug

    Основной целью расширения является максимально возможное упрощение отладки PHP-скриптов и добавление в разработку на PHP таких удобств, как точки останова, пошаговое выполнение и наблюдение за выражениями, которое мы привыкли видеть только в компилируемых языках программирования.

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

    Установка Xdebug

    Уже довольно давно Xdebug, как расширение для php, присутствует в репозиториях. Поэтому его установка очень проста, для этого введите в консоли следующую команду.

    С установкой покончили. Перейдем к настройке.

    Настройка Xdebug

    Настройка расширения выполняется при помощи редактирования конфигурационных ini файлов. Тут есть два пути:
    1. В php.ini создаем секцию [xdebug] и в ней задаем параметры.
    2. Все параметры задаем в xdebug.ini, который хранится тут /etc/php5/conf.d/xdebug.ini
    Тут решать Вам и только Вам.

    Куда писать — определились. Определимся что писать?
    Давайте я приведу список настроек, и поясню, что они означают:

    После, необходимо чтобы наши изменения подтянулись.
    Для этого нужно перезагрузить apache или php-fpm (в зависимости от того, что Вы используете).

    Чтобы убедиться, что все хорошо, выведите
    phpinfo();
    Если такой текст имеется — значит все отлично:

    This program makes use of the Zend Scripting Language Engine:
    Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
    with Xdebug v2.1.0, Copyright (c) 2002-2010, by Derick Rethans

    Теперь проверим улучшенный var_dump:

    Вы должны увидеть красивый стилизированный вывод содержимого массива.
    Теперь создадим ошибку (забудем ; в конце строки)

    Вы должны увидеть подробное сообщение об ошибке, представляющее собой таблицу.

    Настройка PhpStorm

    Настройка NetBeans IDE

    Устанавливаем NetBeans, если он еще не установлен. Заходим в СервисПараметры. Переходим в меню PHP, далее вкладка Отладка (Debugging).
    И указываем следующие значения.
    Порт отладчика: 9000
    Идентификатор сеанса: netbeans-xdebug
    Хочу отметить, что порт сеанса, как и идентификатор сеанса могу быть другими. Например, можно указать идентификатор ide-xdebug , но тогда и в конфигах Xdebug придется указать такое же значение.

    Остальные параметры настраиваем под себя.

    Ну, а о том, как выполнять отладку — в другой раз.

    Отладка PHP в Visual Studio Code и OpenServer

    Прежде всего узнаем версию PHP, которая используется на текущий момент в OpenServer.
    Нажимаем в трее правой кнопкой мыши на флажок OpenServer -> Настройки -> Дополнительно -> Конфиграция -> «Версия PHP».
    У меня запущена версия PHP-7-x64. Она будет использоваться для примера.

    Необходимо установить XDebug, если он не уставновлен. Dll файл скачивается со страницы загрузки. В OpenServer этот модуль уже установлен, надо лишь убедиться в наличии нужной php_xdebug.dll. Идём в директорию установки OpenServer далее modules\php\PHP-7-x64\ext и убеждаемся, что e:\OpenServer\modules\php\PHP-7-x64\ext\php_xdebug.dll на месте.
    Сконфигурировать PHP для использования XDebug.
    Идём в настройки OpenServer -> Дополнительно -> конфиграция -> PHP-7-x64 и раскоментируем следующие строчки

    Обратие внимание remote_autostart = 1
    Перезапускаем OpenServer

    Альтернативой автостарта XDebug является расширение Xdebug helper для Chrome. Оно позволяет включать отладку только тогда, когда она нужна.

    1. Проверяем установку xDebug. Заходим по адресу http://127.0.0.1/openserver/phpinfo.php
      Должна появится секция про xdebug.

    Подготовим Visual Studio Code

    Необходимо установить PHP Debug
    Нажимаем Ctrl+Shift+X
    Ищем PHP, выбриаем расширение PHP Debug, устанавливаем.

  • Собственно ставим breakpoint и наслаждаемся.
  • Для автокомплита PHP следует использовать не самое популярное расширение, а PHP Intelephense

    Отладка программ

    (поиск и устранение ошибок) представляет собой неотъемлемую часть разработки программного обеспечения. Программист, работающий на языке PHP, должен быть знаком со всеми доступными инструментальными средствами, позволяющими выявлять неправильно функционирующие компоненты в программных системах.

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

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

    Кроме встроенных средств формирования сообщений об ошибках языка PHP и технологий, поддерживаемых этим языком, программисты, работающие на языке PHP, в последнее время получили возможность использовать такие же разновидности инструментальных средств отладки, которые в течение многих лет находились в распоряжении программистов, работающих на других языках. Основной среди этих инструментальных средств является среда отладки Zend, которая позволяет контролировать значения переменных, устанавливать точки прерывания и обеспечивать пошаговое выполнение программ с любой желаемой скоростью. В этой статье среда отладки Zend не рассматривается, но ее описание и другие дополнительные сведения можно найти по адресу www.zend.com.

    В этой статье приведено лишь вводное описание инструментальных средств и методов, которыми может воспользоваться разработчик, стремящийся создать безукоризненно действующее программное обеспечение на языке PHP.

    Общие стратегии поиска неисправностей

    Двумя основными составляющими всей деятельности по отладке являются обнаружение причин нарушения в работе и последующее их устранение (без нарушения функционирования чего-либо иного под воздействием побочных эффектов реализации принятого решения). Это утверждение остается справедливым независимо от того, осуществляется ли диагностика программы PHP, телефонного коммутатора, электронной схемы или автомобиля «Копейка», — определенные принципы остаются в силе, о какой бы рассматриваемой проблемной области не шла речь. Всегда руководствуйтесь таким подходом, пытаясь выяснить, в чем причина нарушений в работе рассматриваемого программного обеспечения.

    Внесение изменений только в одном месте

    При проведении любых экспериментов необходимо руководствоваться основным правилом: если функционирование рассматриваемого объекта зависит от многочисленных факторов, то невозможно заранее узнать со всей определенностью, чем вызван какой-то конкретный сбой. Поэтому всегда следует вносить только одно изменение, затем проверять полученные результаты и определять, удалось ли устранить нежелательное поведение объекта. В случае отрицательного ответа необходимо внести еще одно изменение (возможно, полностью отменив внесенное перед этим изменение).

    Ограничение области проявления проблемы

    Если удастся свести поиск причин проблемы до единственной библиотеки или функции, это можно рассматривать как значительный успех в процессе поиска источника проблемы. Используйте специальные вызовы функций echo() и print_r() для своевременного вывода информации трассировки. Это позволяет определить тот момент, когда возникают изменения, являющиеся причиной нарушения в работе, и в какое время переменные приобретают такие значения, которые не должны были содержать.

    Кроме того, для контроля над функционированием программ и за поведением компонентов программ в ходе их функционирования можно использовать отладчик с графическим интерфейсом (такой как Zend Studio).

    Упрощение и последующее усложнение

    Эта рекомендация может показаться очевидной, но о ней часто забывают. Если приходится сталкиваться с нарушениями в работе, связанными с использованием какой-то конкретной функции или средства, соответствующий компонент необходимо исключить из программы (либо заменив фиктивным вызовом, либо обозначив комментариями) и проверить, позволяет ли это добиться нормального функционирования программы. Еще один вариант состоит в том, чтобы заменить динамические данные статическими данными (например, вместо получения данных с помощью запроса к базе данных применить простые операторы присваивания значений переменным). Добейтесь успешного функционирования программы в наиболее упрощенных условиях, а затем поэтапно усложняйте программу, каждый раз проводя проверку, чтобы узнать, на каком этапе обнаруживаются ошибки.

    Документирование принятых решений

    Такая ситуация встречается слишком часто: программист часами отыскивает причину ошибки (или даже откладывает эту работу на следующий день) и наконец находит решение. Не следует после этого сразу же отправляться праздновать победу. Найдите время, чтобы отразить в комментариях к программе то, в чем состояла ошибка и каковым является решение. Это позволит вам быть во всеоружии, если снова возникнет та же проблема, а она непременно возникнет.

    Повторная проверка после исправления ошибок

    Нередко встречается такая ситуация, когда устранение проблемы в одном компоненте приводит к нарушению в работе какого-то другого компонента. Именно поэтому необходимо еще раз проверить систему, чтобы убедиться в ее нормальной работе не только в том месте, где была первоначально обнаружена ошибка, но и во всех других местах, где могут возникнуть нарушения. Данная рекомендация позволяет также понять, почему так важно ограничивать область действия ошибок в максимально возможной степени, — это дает возможность уменьшить объем необходимого повторного тестирования.

    Общая классификация ошибок

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

    Ошибки на этапе компиляции

    Язык PHP является компилируемым, но компиляция программы осуществляется непосредственно перед ее выполнением, поэтому сам процесс компиляции не столь очевиден, как в языке C или Java.

    Ошибки, возникающие на этапе компиляции, обнаруживаются машиной Zend Engine, которая осуществляет компиляцию. Компилятор формирует сообщение об ошибке, часто указывая номер строки, и после получения такого сообщения программист может приступить к устранению проблемы. К категории ошибок, обнаруживаемых на этапе компиляции, относятся неправильно введенные имена переменных, отсутствующие точки с запятой и несогласованные круглые скобки.

    Ошибки этапа выполнения

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

    Логические ошибки

    По-видимому, логические ошибки относятся к категории ошибок, наиболее трудно поддающихся обнаружению. А если первоисточником подобной ошибки является неправильное понимание программистом каких-то аспектов решаемой задачи, то такая ошибка очень сложно поддается исправлению.

    Предположим, перед программистом поставлена задача обеспечить запуск космического зонда и вывести его на орбиту вокруг Марса. Программист из США предусмотрел в своем навигационном алгоритме получение входных данных в фунтах и дюймах, но требуемые данные поступают из европейского центра управления полетами в метрической системе. Очевидно, что при таких условиях космический зонд непременно врежется в марсианскую поверхность. Программное обеспечение действовало в полном соответствии с заданием, но, строго говоря, при таких условиях задание предусматривало вывод ракеты прямо на Марс. Это — логическая ошибка.

    Из этого следует, что необходимо добиться того, чтобы программа не просто вырабатывала выходные данные, но вырабатывала их правильно. Воспользуйтесь отдельно взятой процедурой расчетов и убедитесь в том, что формируемые программой результаты являются правильными; еще один вариант состоит в том, что результаты программы должны сравниваться с заведомо известными правильными значениями. А для того чтобы не попадать в неприятную историю, не пишите программы на языке PHP для космических кораблей ;).

    Использование журналов веб-сервера

    Эксплуатация большинства программ PHP приводит к получению HTML-страниц того или иного рода, а эти страницы, в свою очередь, передаются пользователю с помощью HTTP-сервера, такого как Apache или Microsoft Internet Information Server (IIS). Это означает, что дополнительным источником ошибок может стать программное обеспечение веб-сервера. По этой причине важно знать, какой способ применяется в веб-сервере для формирования и регистрации сообщений об ошибках, а также знать о том, как получить доступ и провести синтаксический анализ журналов, в которых регистрируются ошибки.

    Сервер Apache

    На HTTP-сервере Apache ведутся два файла журнала в формате открытого текста. Эти журналы описаны ниже:

    Apache/logs/access.log

    Предназначен для регистрации каждого запроса на получение файла, передаваемого по протоколу HTTP. К регистрируемым данным относятся дата, время и полученные результаты (успешное или неудачное завершение, о чем можно судить по числовому коду состояния). Этот журнал представляет собой также журнал регистрации доступа, в котором фиксируется IP-адрес, из которого поступил каждый запрос.

    Apache/logs/error.log

    Это — журнал регистрации ошибок, в котором фиксируются только ситуации, связанные с возникновением ошибок.

    Унифицированный формат журнала

    По умолчанию для оформления записей в файле error.log сервера Apache используется унифицированный формат журнала, который принят в качестве стандартного. В этом формате каждая запись соответствует отдельному экземпляру действия, касающегося запроса и/или ответа (в конечном итоге HTTP-серверы занимаются обработкой именно запросов и ответов). Например, одна строка журнала может соответствовать запросу на получение HTML-страницы (и содержать сведения о том, в каких обстоятельствах эта страница была впоследствии предоставлена сервером Apache). А следующая строка может описывать (автоматическое) выполнение запроса и передачу файла JPEG, связанного с ранее затребованным документом HTML.

    В любом случае записи в унифицированном формате журнала выглядят примерно так, как показано ниже (в действительности каждая запись занимает только одну строку):

    Ниже перечислены наиболее важные компоненты данной строки:

    127.0.0.1. IP-адрес клиента, от которого поступил запрос по протоколу HTTP (в данном случае локальный хост).

    [12/Jan/2013:03:18:33 +0400]. Дата, время и разница между временем текущего часового пояса и всеобщим скоординированным временем (Universal Coordinated Time — UTC).

    Илон Маск рекомендует:  Что такое код ocicollassignelem

    GET. Тип запроса HTTP — GET или POST.

    /images/lang.gif. Затребованный файл.

    HTTP/1.1. Версия протокола HTTP, используемого для передачи запроса.

    200. Код ответа, описывающий результат запроса (дополнительная информация на эту тему приведена ниже в данном разделе).

    6590. Количество байтов, переданных в ответе HTTP, соответствующем этому запросу.

    Коды ответов HTTP

    Количество кодов ответов HTTP весьма велико (хотя самым знаменитым остается код сообщения об ошибке «404 Not Found»), но сами эти коды подчиняются общему шаблону, с помощью которого можно быстро узнать назначение каждого кода. По существу, данные шаблоны подразделяются на категории, описанные ниже:

    Коды ряда 200 указывают на успешное завершение.

    Коды ряда 300 обозначают перенаправление.

    Коды ряда 400 указывают на клиентскую ошибку (подобную указанию в запросе несуществующего документа).

    Коды ряда 500 указывают на серверную ошибку.

    Полный список кодов ответов HTTP приведен по адресу www.w3.org/Protocols/rfc2616/rfc2616-sec10.html.

    Сервер IIS

    В HTTP-сервере IIS компании Microsoft задача ведения журнала осуществляется иначе. Сервер IIS не записывает журнал в файл, а регистрирует полученную им информацию о состоянии и об обнаруженных ошибках таким образом, чтобы эта информация была доступна для исследования в программе Event Viewer. Ошибки, зарегистрированные сервером IIS, можно найти в части System Log окна Event Viewer, где для обозначения источника применяется имя W3SVC.

    Средства формирования сообщений об ошибках и ведения журнала интерпретатора PHP

    Неоценимую помощь при выявлении ошибок может оказать сам интерпретатор PHP. Даже без какой-либо дополнительной настройки система PHP способна выводить сообщения об ошибках вместе с выходными данными. Эти сообщения передаются прямо в окно браузера вместе с номерами строк. Для большинства программистов этих сведений вполне достаточно, чтобы можно было воспользоваться самим интерпретатором PHP как средством отладки, но, чтобы получить максимум пользы от этих средств, важно знать все нюансы настройки конфигурации, от которых зависят условия формирования сообщений об ошибках.

    Безусловно, интерпретатор PHP показывает номер строки, в которой была обнаружена ошибка, но следует знать о том, что этот номер не всегда указывает на ту строку, к которой следует перейти, чтобы внести исправление. Иногда отсутствующая закрывающая кавычка или пропущенная точка с запятой не обнаруживается интерпретатором до завершения обработки нескольких следующих строк, поэтому нужно быть готовым к тому, что придется вернуться немного назад, чтобы найти причины синтаксических ошибок такого рода.

    Формирование сообщений об ошибках

    Выполняемая интерпретатором PHP операция включения сообщения об ошибке в вывод программы (что чаще всего приводит к отображению сообщения об ошибке в окне браузера) по существу представляет собой операцию формирования сообщения об ошибке. Формирование сообщений об ошибках является полезным диагностическим инструментальным средством, использование которого разрешено по умолчанию. Если же интерпретатор PHP подключен к серверу производственного назначения, то данное средство должно быть запрещено.

    Чтобы разрешить или запретить формирование сообщений об ошибках, необходимо внести изменение в файл php.ini. При этом корректировка применяется к параметру display_errors. Если требуется, чтобы сообщения выводились в составе формируемых выходных данных, то в файле php.ini должна присутствовать следующая строка:

    Если же сообщения об ошибках не должны отображаться (и это действительно не допустимо, если сервер используется для предоставления к нему общего доступа), то соответствующая строка должна выглядеть таким образом:

    Игнорирование данной рекомендации при эксплуатации сервера производственного назначения приводит к тому, что функционирование средств формирования сообщений об ошибках вызовет непреднамеренное раскрытие перед пользователями важных сведений об организации программного обеспечения. Например, какое-либо непредвиденное условие может вызвать появление в окне незащищенного браузера имени переменной или таблицы базы данных. А потенциальный нарушитель сможет воспользоваться этой информацией для несанкционированного доступа к серверу.

    Регистрация ошибок

    Регистрация ошибок аналогична по своему назначению формированию сообщений об ошибках, но предусматривает запись информации о событиях, связанных с ошибками, в текстовый файл, а не вывод этой информации на экран. Такой вариант представления сведений об ошибках более приемлем с точки зрения защиты. Кроме того, поскольку файлы журналов должны храниться в каталоге с ограниченным доступом, этот метод регистрации ошибок более предпочтителен для использования на HTTP-серверах производственного назначения.

    Как и в случае средств формирования сообщений об ошибках, применение средств регистрации ошибок может быть разрешено или запрещено с помощью файла php.ini. Чтобы разрешить использование этих средств, необходимо применить следующую опцию:

    В противном случае следует задать такую опцию:

    По умолчанию средства регистрации ошибок запрещены в файле php.ini.

    Определение категории ошибок, подлежащих выводу на экран или записи в журнал

    Принимая решение об использовании средств формирования сообщений об ошибках (для вывода на экран) или средств регистрации ошибок (для записи в файл), необходимо дополнительно указать, какие ошибки рассматриваются как достаточно серьезные для предоставления информации о них пользователю. Параметры настройки средств ведения журнала задаются в файле php.ini с помощью значения параметра error_reporting. По умолчанию параметру error_reporting присваивается следующее значение:

    Такая настройка указывает, что пользователю должна предоставляться информация обо всех ошибках и предупреждениях (что показывает параметр E_ALL), но вместе с тем действует условие (что показывает оператор &), согласно которому извещения этапа прогона не подлежат выводу (для этого служит параметр

    представляет собой оператор отрицания).

    Степень серьезности отображаемых сообщений об ошибках, которая определена параметром error_reporting, отражается на поведении средств регистрации ошибок (если их использование разрешено с помощью параметра log_errors=On) и средств формирования сообщений об ошибках (если их использование разрешено с помощью параметра display_errors=On) или одновременно тех и других средств, если все они разрешены.

    Функции формирования сообщений об ошибках

    Язык PHP не только в значительной степени упрощает работу программистов, но и включает в себя широкий набор функций, которые могут использоваться программистами для облегчения поиска причин нарушений в работе и в целом для получения сведений обо всех аспектах состояния разрабатываемых ими программ. Спектр таких средств начинается с обычных операторов формирования вывода (print, echo и тому подобных), используемых в тех контекстах, когда требуется контролировать значения переменных, и заканчивается специализированными функциями, осуществляющими вывод данных с помощью механизмов ведения журналов операционной системы.

    В настоящем разделе даны вводные сведения о некоторых функциях PHP, которые позволяют выявлять причины проблем и создавать отчеты об условиях функционирования программ.

    Диагностические операторы вывода

    Простейший метод устранения нарушений в работе предусматривает размещение в ключевых местах кода операторов echo и print, для того чтобы формируемые выходные данные содержали информацию о ходе выполнения программы, осуществляемого на основе вызова различных функций, а также о том, какие значения принимают наиболее важные переменные в различных точках.

    Использование таких средств можно сравнить с применением простейшего отладчика, поскольку операторы вывода позволяют отслеживать значения переменных во время выполнения программы и следить за тем, не происходит ли присваивание этим переменным каких-либо непредусмотренных значений (и в случае положительного ответа на этот вопрос позволяют узнать, когда это происходит).

    Использование функции var_dump()

    Обычные функции вывода являются довольно удобными, но с точки зрения отладки более специализированные функции может оказаться гораздо полезнее. Наиболее важной среди функций подобного типа является функция var_dump(). Она может рассматриваться как чрезвычайно «остроумный» оператор вывода, который, кроме всего прочего, автоматически представляет содержимое любого массива в таком виде, который очень удобен для восприятия человеком.

    Напомним, что выполнение приведенного ниже кода приводит к получению результатов, от которых мало пользы:

    Данные результаты сводятся к следующему:

    Использование конструкции echo для вывода массива

    Это нам ничего не дает. С другой стороны, если за определением того же массива следует строка

    то формируется следующие намного более полезные выходные данные:

    Использование функции var_dump() для вывода массива

    На основании таких данных программист, занимающийся отладкой, может немедленно определить, каково содержимое данного массива (чему равны ключи и значения элементов этого массива).

    Использование функции syslog()

    В языке PHP предусмотрена функция syslog(), которая позволяет осуществлять запись непосредственно в журнал операционной системы, под управлением которой функционирует среда PHP. Это удобная функция, которая становится особенно полезной, если требуется регистрировать всю информацию о проблемах, возникающих в системе, с помощью стандартных средств, или есть необходимость предупредить о нарушении в работе системного администратора, если он непосредственно не соприкасается с разработками на языке PHP.

    В целом функция syslog() позволяет указать степень серьезности, связанную с регистрируемым событием, а также ввести сообщение, которое описывает это событие. Затем указанные значения могут быть выведены в журнал для использования в качестве вспомогательной информации для диагностики.

    Все возможные опции определения степени серьезности функции syslog() показаны в следующем коде:

    В системе Microsoft Windows первые три из этих сообщений об ошибках (от LOG_DEBUG до LOG_NOTICE) рассматриваются как информационные, четвертое и пятое считаются предупреждающими, а последние три отмечаются в программе Event Viewer как относящиеся к категории Alerts. Все эти сообщения отображаются со значением источника c-client, которое соответствует одному из вспомогательных процессов сервера Apache:

    Сообщения об ошибках с различными степенями серьезности в программе Event Viewer

    Использование функции error_log()

    Функция error_log() может использоваться для передачи сообщения об ошибке почти в любое место назначения, включая адрес электронной почты. Эта функция предоставляет легкий и удобный способ формирования отчета о непредвиденных условиях, возникших в процессе функционирования программного обеспечения PHP, но, к сожалению, этим средством пользуются лишь немногие разработчики. Более подробно она описана в предыдущей статье в разделе «Ведение журнала и отладка».

    Отладка php

    Частная коллекция качественных материалов для тех, кто делает сайты

    • Фотошоп-мастер2000+ уроков по фотошопу
    • Фото-монстр300+ уроков для фотографов
    • Видео-смайл200+ уроков по видеообработке
    • Жизнь в стиле «Кайдзен» Техники и приемы для гармоничной и сбалансированной жизни

    В этом разделе помещены уроки по PHP скриптам, которые Вы сможете использовать на своих ресурсах.

    Фильтрация данных с помощью zend-filter

    Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.

    Контекстное экранирование с помощью zend-escaper

    Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

    Подключение Zend модулей к Expressive

    Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

    Совет: отправка информации в Google Analytics через API

    Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

    Подборка PHP песочниц

    Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

    Совет: активация отображения всех ошибок в PHP

    При поднятии PHP проекта на новом рабочем окружении могут возникнуть ошибки отображение которых изначально скрыто базовыми настройками. Это можно исправить, прописав несколько команд.

    Агент

    PHP парсер юзер агента с поддержкой Laravel, работающий на базе библиотеки Mobile Detect.

    Отладка PHP кода в PhpStorm с использованием Xdebug

    Основным преимуществом использования PhpStorm вместо блокнота при написании кода является возможность использования отладчика (или «дебаггера»). Отладчик позволяет проникнуть внутрь кода для отслеживания изменения переменных и анализа логики его работы на различных этапах исполнения скрипта или движка, в нашем случае — Drupal.

    Скажу честно, что я начал активно использовать дебаггер только спустя полутора лет web-разработки. Да, я считал, что надо «писать код бляць» и не отвлекаться на изучение каких-то непонятных дебаггеров. Но в конечном счете мне пришлось столкнуться с серьезной командной разработкой, где без использования отладчика делать было нечего. Поэтому мой вам совет: потратьте один, да хоть и два дня, но разберитесь в тонкостях работы с PHP отладчиком. Ну а я вам в этом постараюсь помочь.

    В рамках этой статьи будет рассмотрена связка OpenServer, Xdebug (по умолчанию идет с OpenServer) и PhpStorm — про первичную настройку среды разработки я уже писал, рекомендую начать с нее. Также нам потребуется уже созданный локальный сайт и проект в PhpStorm – у меня это будет www.angarsky.loc .

    Конфигурация отладчика в PhpStorm

    Настраивать отладчик мы будем на примере index.php – начинайте настройку именно с этой страницы, т.к. при запуске движков она обязательно отрабатывает.

    В раскрывшемся окне первым делом жмем на значок «+» и выбираем PHP Web Application. Заполняем поле Name, выбираем ваш любимый браузер для разработки и в качестве Start URL указываем страницу сайта для стартового запуска. Обратите внимание, что указывается относительный путь.

    Следующим шагом будет конфигурирование Server. Опять же жмем «+» , заполняем Name, Host и Use path mappings. Заполняем все по аналогии со следующим скриншотом и жмем «ОК».

    Аналогичным нажатием на «ОК» завершаем конфигурацию и PHP Web Application. Если все сделано верно, то можно приступать к пробному запуску. Для этого ставим Breakpoint (по-русски, «точка остановки») и жмем иконку запуска дебаггера.

    Если все сделано верно, то вас перебросит в выбранный браузер, где начнет загрузку страница вида:
    http : //www.angarsky.loc/?XDEBUG_SESSION_START=10098 .
    Буквально сразу у вас замигает иконка PhpStorm на панели Windows. Переходим в PhpStorm и видим следующую картину.

    Теперь более подробно о том, что я отметил маркерами:

    1. Стек функций, который прошел скрипт до нашего Breakpoint’а.
    2. Список переменных, доступных в данной функции в данный момент исполнения кода.
    3. Список переменных для отслеживания . Сюда вы можете перетаскивать все необходимые переменные из второй колонки, значения которых необходимо отследить.
    4. Кнопка остановки отладчика .
    5. Кнопки для навигации в коде: переход на следующую строку кода, переход к следующей точке остановки. Однако я рекомендую работать с горячими клавишами – о них чуть ниже.
    6. Указатель строки текущего состояния отладчика.

    Чтобы выйти из состояния отладки нажмите «F9» . Можете перейти обратно в браузер и убедиться, что страница сайта загрузилось как обычно. Если обновить страницу, то опять сработает дебаггер – это будет происходить до тех пор, пока вы не отключите процесс отладки.

    Управление процессом отладки

    Ниже приведены комбинации горячих клавиш, необходимых для быстрой отладки кода:

    • F7 – переход к следующему шагу кода, выполняя заход во все встречающиеся функции.
    • F8 – переход к следующей строке кода, минуя заход в функции.
    • F9 – переход к следующему Breakpoint’у или завершение процесса отладки при их отсутствии.
    • Shift + F8 – выход из текущей функции.

    Для дальнейшего наглядного примера я поставил Breakpoint в своей кастомной функции, отвечающей за изменение комментариев.

    Как вы можете заметить стек функций уже гораздо больший, нежели в первом примере. Теперь небольшое пояснение по горячим клавишам.

    Собственно сейчас отладчик находится на строке 15. Если «шагать» по коду, используя клавишу F7, то вы через два шага вы окажетесь в функции drupal_get_path ( ) . При использовании клавиши F8 функция drupal_get_path ( ) будет выполнена в фоне, а вы сразу окажетесь на строке 18. При нажатии комбинации Shift + F8 вы выйдете из текущей функции и окажитесь в theme ( ) на 1222 строке (см. стек функций). Таким образом, для быстрой отладки необходимо владеть всеми этими приемами.

    Отладка PHP ошибок

    Любой разработчик рано или поздно сталкивается с ошибками в коде. Серьезные ошибки Drupal выводит в сообщениях статуса, предупреждения (PHP warnings) логирует в журнале. Именно для устранения ошибок нам и пригодится отладчик. Для начала выясняем, на каком этапе появляется ошибка (название функции и номер строки) и устанавливаем Breakpoint в данное место. Запускаем отладчик и начинаем поиск ошибки:

    • проверяем все переменные, массивы, объекты;
    • анализируем их изменение в теле функции;
    • переходим на вышестоящие в стеке функции (по клику мыши названию функции в нижнем левом окне по), смотрим, какие данные передаются в текущую функцию;
    • расстанавливаем новые Breakpoint’ы, если это необходимо.

    Устранение ошибок может занять как от нескольких секунд, так до нескольких часов, особенно, если разработчик слабо знаком с архитектурой Drupal . Навык отладки приходит со временем – я, как бы хотел, не смогу объяснить в рамках данного поста все нюансы. Однако дам несколько советов, которые, возможно, позволят сэкономить несколько минут:

    • при установке Breakpoint на массив – размещайте его на строке с первым элементом массива, иначе он не отработает;
    • используйте условные Breakpoint’ы – «Edit» в раскрывающемся меню по левому клику мышки (например, условие «$variables[‘ >);
    • изменяйте файлы ядра, только если у вас подключен Git (или другая система контроля версий) для того, чтобы после отладки без проблем откатить ядро в первозданный вид;
    • для быстрого перехода в функцию используйте клик мышкой по ее названию с зажатой клавишей Ctrl.

    Собственно на этом теория заканчивается и вам пора переходить к практике. Еще раз повторюсь, не переживайте о предстоящем затраченном времени – умение работать с отладчиком вам не раз еще пригодится. Надеюсь, материал окажется хоть для кого-то полезным – уведомьте меня тогда, пожалуйста, об этом в комментариях!

    Отладка PHP приложения в Sublime Text с использованием Xdebug

    Всем нам приходится отлаживать свой код. Кодить код идельно с первого раза очень сложно и только некоторые (и то вряд ли) могут похвастаться этим. Уже есть достаточно статей о том, как использовать xdebug в той или иной IDE, но сегодня я расскажу о том, как организовать совместную работу Xdebug с Sublime Text 2 или 3.

    Начнём

    Прежде всего нам необходимо иметь установленное расширение для PHP под названием Xdebug. Если его у вас еще нет — есть так же масса статей о его установке и конфигурации. Как бы то ни было — это тема отдельной статьи. Удостоверьтесь, что Xdebug работает в phpinfo() , он должен присутствовать в списке. Ну, и конечно, у нас должен быть сам Sublime Text. Я буду использовать последнюю версию (на текущий момент это 3 версия), но так же этот способ должен работать и с Sublime Text 2.

    Настройка Xdebug

    Прежде всего нам необходимо настроить Xdebug, добавив в ваш php.ini несколько строчек. Так же есть ещё вариант выделить конфиг в отдельный файл xdebug.ini , он, пожалуй, более предпочтительный. Можете почитать об этом на английском тут.

    127.0.0.1 — это адрес вашего компьютера. Логгирование не обязательно, но иногда, на случай проблем, помогает разобраться с ошибками.

    Не забудьте перезапустить web-сервер.

    Установка Sublime Text 3

    Одна из сильных сторон Sublime Text в том, что вы можете с лёгкостью расширяеть его функциональность с помощью сторонних пакетов. В данном случае мы как раз воспользуемся этой возможностью и установим Xdebug-клиент для отладки. Если вы не устанавливали сторонние пакеты до этого, то для начала установить менеджер пакетов.

    Как только менеджер пакетов установлен, вам следует открыть в Sublime Text командное меню (Ctrl+Shift+P) и выбрать пункт «Install Package».

    Менеджер обновит репозиторий и теперь можно найти нужный нам пакет. Наберите в строке поиска: «Xdebug client».

    Наконец, последня вещь, которую нам нужно сделать — настроить сам проект. Самый простой способ сделать это — открыть корневую директорию вашего проекта, перейти в меню «Project» и выбрать пукнт «Save Project As. «. Я рекомендую вам сохранить вам файл проекта в корневой директории, таким образом вы сможете поместить его под контроль версий, чтобы потом с лёгкостью настроить отладку заново на другой машине.

    Откройте только что созданный файл проект. Внутри вы увидите json с параметрами. Выглядеть это может по-разному. Например так:

    Нам необходимо добавить немного своего:

    Как вы уже заметили, я только добавил URL моего web-приложения. Мы можем добавить и другие настройки Xdebug, но для начала нам хватит и этого минимального набора. URL приложения можно установить и непосредственно в самих настройках пакета, но в таком случае, при работе с несколькими проектами, придётся менять этот URl каждый раз.

    Старт Xdebug сессии

    Теперь мы можем выполнить старт Xdebug сессии и проверить всё ли верно мы настроили. В меню кликните на «Tools» — «Xdebug» — «Start debugging». Вы заметите, что открылся ваш браузер. А к URL вашего приложения добавилась строка XDEBUG_SESSION_START=sublime.xdebug . Таким образом мы выполнили старт сессии отладки. При этом в Sublime Text появится пара дополнительных панелей с отладочной информацией, когда вы установите точки прерывания.

    Точки прерывания (Breakpoints)

    Давайте установим наши breakpoints. Точки прерывания, простыми словами, это метка, где ваше приложение должно приостановиться, когда его достигнет. В этот момент вы можете происпектировать все значения переменных для того, чтобы выяснить, что же происходит в вашей программе.

    Мы можем добавить точку с помощью клика правой кнопкой мыши на нужной нам строке в коде, перейти в подменю «Xdebug», и выбрав пункт «Add/Remove Breakpoint». На нужной нам строке появится маркер, который будет указывать на то, что в данном месте установлена точка прерывания.

    Нам нужно перейти в наш браузер и продолжить ту сессию, которую мы только что начали. Вы должны заметить, что как только мы перейдём на страницу, на которой установлена точка прерывания, она перестанет загружаться. Теперь, если вы откроете Sublime Text, то вы увидите много информации, которую показывает нам в панелях Xdebug.

    Xdebug stack и Xdebug context очень полезные панели. В стеке мы можете увидеть весь стек вызовов, через которое прошло приложение, прежде чем добраться до точки прерывания.

    В контексте вы увидите все глобальные переменные, а так же переменные, которые вы объявили самостоятельно. Вы можете кликнуть на этих переменные для того, чтобы посмотреть какое значение они содержат. Для примера, на скриншоте я кликнул на переменной $_SERVER.

    Обратите внимание на желтую стрелку на точке останова, она указывает, что приложение в данный момент приостановлено.

    Наше приложение приостановлено и теперь мы можем смотреть значения наших переменных. Для того, чтобы продолжить нашу отладку, кликните правой кнопкой мыши по нашей строчке и перейдите в подменю «Xdebug». Там будет несколько доступных команд:

    • Run Продолжит выполнение программы до следующей точки или до выхода из приложения
    • Run to line Продолжит выполнение программы до строки, которую вы укажете
    • Step into Зайдёт внутрь текущей функции и остановится внутри неё
    • Step over Перешагнёт через функцию и остановится сразу после её окончания
    • Step out Выйдет их текущей функции и остановится сразу после её окончания
    • Stop Остановит отладку
    • Detach Так же выполняет остановку отладки
    Илон Маск рекомендует:  Курсор сам по себе (IE)

    Run и Stop вполне понятные пункты. Методы Step могут смущать новичков. Давайт рассмотрим простой пример.

    Представьте, что вы добавили точку останова на первой линии внутри метода bar. Там, где указан комментарий // Breakpoint

    Если выбрать Step into, то отладчик зайдет внутрь метода fooBar и остановится на его первой линии. В данном случае отладчик остановится на строке return array_values($arr);

    Step over выполнит выхов метода, но не остановится в нём. Он остановится сразу на следующей линии после вызова метода. В данном случае это линия return $arr;

    Наконец, Step out пройдёт через весь метод и вернётся в место его вызова. В данном случае мы вернёмся в объект, обратно к вызову $arr = self::fooBar($arr);

    Если вы решите выбрать пукнт Run, то отладчик продолжит выполнение программы до тех пор, пока не встретит точку останова или приложение не завершится.

    Заключение

    В данной статье мы рассмотрели способ интеграции Xdebug с Sublime Text и разобрались в азах отладки. Почти каждая IDE, предназначенная для работы с PHP способна работать с Xdebug. Использовать отладчик намного удобнее, чем var_dump .

    Отладка исходного кода PHP в IDE NetBeans

    Для работы с этим учебным курсом требуется следующее программное обеспечение и ресурсы.

    Программное обеспечение или материал Требуемая версия
    IDE NetBeans Пакет загрузки PHP
    Механизм PHP Версия 5
    Веб-сервер Рекомендуется использовать сервер HTTP Apache версии 2.2.
    Отладчик PHP Версия XDebug 2.0 или выше

    Подготовка

    Для успешной отладки приложений PHP в IDE NetBeans для PHP, требуется механизм PHP, локальный веб-сервер Apache и отладчик XDebug, установленный и настроенный для разработки PHP. Если возникают проблемы с запуском XDebug, см. материалы по XDebug на вики-сайте NetBeans и/или обратитесь к сообществу по адресу

    How PHP Debugging with XDebug Works in IDE NetBeans

    When you run XDebug from IDE NetBeans, PHP program execution pauses at every line where you set a breakpoint. Когда исполнение программы установлено на паузу, XDebug может извлечь информацию о текущем состоянии программы, такую, как значения переменных программы. Фактически это означает следующую последовательность выполняемых действий:

    1. Установите точку останова в каждой строке, на которой исполнение исходного кода PHP должно приостановиться.
    2. Начните сеанс отладки.
    3. Когда достигнута строка с точкой останова, исполняйте сценарий по одной строке, нажимая F7 и F8. Отслеживайте состояние приложения в окнах отладчика.
    4. Закройте сеанс отладки.

    For a detailed workflow of using XDebug with IDE NetBeans, see Debugging Session.

    IDE NetBeans обеспечивает панель инструментов отладки, которая используется для пошагового перехода между файлами. См. Работа с панелью инструментов и редактором

    Параметры отладки

    Параметры IDE NetBeans включают вкладку для изменения определенных настроек по умолчанию для отладки PHP. Чтобы открыть эти параметры, зайдите в Tools («Средства») > Options («Параметры») (NetBeans > Preferences («Настройки») на Mac), выберите параметры PHP, после чего выберите вкладку Debugging («Отладка»).

    Примечание . Вкладка ‘Отладка’ была реализована в IDE NetBeans версии 7.1. В более ранних версиях NetBeans на вкладке ‘Общие’ PHP имеются параметры отладки. Не все параметры версии 7.1 доступны в предыдущих версиях.

    В данной панели можно изменить следующие параметры:

      Debugger port («Порт отладчика») Это порт, используемый XDebug и установленный в php.ini. По умолчанию используется порт 9000. Номер порта в этом диалоге должен совпадать с номером порта отладчика, установленным в php.ini. В данном диалоговом окне нельзя изменить порт, используемый XDebug. В >Примечание. Задайте output_buffering = Off в используемом файле php.ini. иначе выводы сценариев будут появляться в окне вывода с задержкой.

    В рамках данного учебного курса нет необходимости менять любые из этих параметров. При желании это можно сделать для включения точек наблюдения.

    Работа с панелью инструментов и редактором

    Редактор позволяет просматривать содержимое файлов. Использование редактора и панели инструментов отладчика при отладке обеспечивает пошаговое выполнение кода и возможность просмотра влияния содержимого файлов на то, что происходит в браузере.

    Использование панели инструментов отладчика

    При запуске сеанса над редактором отладки отображается панель инструментов отладчика.

    Панель инструментов предоставляет возможности выполнения следующих действий:

    Завершить сеанс ( ) Завершение сеанса отладки
    Приостановить ( ) Приостановка сеанса отладки
    Возобновить ( ) Возобновление сеанса отладки
    Обход процедур ( ) Переход к следующему оператору выполнения
    Вход в ( ) Переход к вызову функции
    Выходt ( ) Выход из текущего состояния вызова функции
    Переход к курсору ( ) Запуск выполнения с позиции курсора

    Установка точек останова

    Точки останова, установленные в файлах, указывают позицию, в которой отладчик должен прервать выполнение кода.

    Важно! Для использования XDebug в коде PHP необходимо установить точки останова.

    Для установки точки останова щелкните в левом поле редактора строку, в которой необходимо установить эту точку.

    Чтобы удалить точку останова, щелкните маркер точки останова ( ).

    Также можно временно отключить точки останова. Для этого щелкните правой кнопкой мыши значок точки останова и снимите выделение с ‘Точка останова’ > ✔’Включено’. Выполняется переключение точки останова в отключенное состояние, после чего маркер выделяется серым ( ) и отображается на левом поле.

    Если отладчик во время работы достигает точки останова, отладка приостанавливается, что позволяет просмотреть значения в окнах отладки и перейти к любому месту кода после точки останова.

    Просмотр всплывающих подсказок

    Когда работа отладчика приостановлена в время сеанса отладки, можно навести мышь на идентификатор PHP в редакторе для отображения подсказки. Если идентификатор действителен в выбранном окне стека вызовов, отображается его значение. Также можно выбрать выражения PHP. Значение выражения отображается в подсказке.

    Окна отладчика

    После начала сеанса отладки под главным окном редактора появится несколько окон отладчика. Окна отладчика позволяют отслеживать значения переменных и выражений по мере перебора кода, изучать стеки вызовов исполняющихся потоков, проверять URL-адреса файлов исходного кода и переключаться между сеансами, если запущены параллельные сеансы отладки.

    Все окна отладки можно вызвать из среды IDE путем выбора «Window > Debugging». После активации сеанса отладки можно перейти в окна отладки.

    Окно «Sessions»

    В окне «Sessions» отображаются сеансы отладки, активные в настоящий момент. При запуске сеанса отладки PHP запись для отладчика PHP можно увидеть в окне Sessions («Сеансы»).

    IDE NetBeans также позволяет запускать одновременно несколько сеансов отладчиков. Например, можно одновременно отлаживать проект Java и проект PHP. В данном случае можно определить два сеанса, перечисленных в окне Sessions («Сеансы»).

    Текущий сеанс (т.е. сеанс, которым можно управлять с помощью панели инструментов отладчика) отмечен более заметным значком ( ). Для переключения сеансов дважды щелкните сеанс, который необходимо сделать текущим или щелкните правой кнопкой мыши сеанс, который не является текущим и выберите ‘Сделать текущим’.

    Примечание. Рекомендуется воспользоваться переключением сеансов, если текущий сеанс отложен.

    Также можно щелкнуть правой кнопкой мыши всплывающее окно для завершения сеанса (щелкните правой кнопкой мыши и выберите ‘Завершить’) или переключитесь между отладкой текущего потока или всех потоков в сеансе (щелкните правой кнопкой мыши и выберите ‘Область’ > ‘Отладка всех потоков’ или ‘Отладка текущего потока’).

    Окно «Variables»

    Когда работа отладчика приостановлена, в окне Variables («Переменные») отображаются переменные текущего объекта window для выбранного кадра стека вызовов. Узел отображается для каждой переменной в текущем окне. Суперглобальные переменные группируются в отдельном узле.

    По мере продвижения по коду значение некоторых локальных переменных может меняться. Такие локальные переменные в окне «Local variables» отображаются полужирным шрифтом. Также можно щелкнуть непосредственно столбец «Value» и вручную изменить значения переменной.

    Окно «Watches»

    Установка точек наблюдения нарушает стабильную работу XDebug и не рекомендуется. По умолчанию точки наблюдения отключены. Однако, если точки наблюдения все же нужно установить, см. Использование дополнительных точек наблюдения.

    Окно «Call Stack»

    В окне «Call Stack» («Стек вызовов») представлена последовательность вызовов, осуществленных в процессе выполнения. При приостановке отладчика в окне «Call Stack» отображается последовательность вызовов функций (т.е. стек вызовов). При первой приостановке автоматически выделяется самое верхнее окно стека вызовов. Дважды щелкните вызов функции в окне, чтобы перейти к этой строке в редакторе. Если выполнен вызов к классу PHP, окно навигатора также переместится к этой строке, если дважды щелкнуть вызов.

    Можно дважды щелкнуть кадр стека вызовов, чтобы выбрать его, а затем рассмотреть значения переменных или выражений для данного кадра в окнах Variables («Переменные») и Watches («Точки наблюдения»).

    Окно «Threads»

    Окно Threads («Потоки») указывает, какой сценарий PHP активен в настоящий момент и выполняется ли он, либо находится на точке останова. Если сценарий выполняется, необходимо перейти в окно браузера для взаимодействия с ним.

    Окно «Sources»

    В окне «Sources» отображаются все файлы и сценарии, загруженные для сеанса отладки. В настоящий момент окно Sources («Исходные коды») не работает для проектов PHP.

    Окно «Breakpoints»

    Для просмотра всех точек останова, установленных в среде IDE, можно использовать окно «Breakpoints».

    Из окна Breakpoints можно включать или отключать точки останова в окне Context («Контекст»). Также можно создавать группы точек останова.

    Сеанс отладки

    Следующая процедура представляет собой последовательность выполняемых действий в типичном сеансе отладки.

    Для запуска сеанса отладки выполните следующее:

    1. Запустите среду IDE и откройте файл, содержащий исходный код, который необходимо отладить.
    2. Установите точку останова в каждой строке, где отладчику следует приостановить работу. Для установки точки останова, поместите курсор в начало строки и нажмите Ctrl-F8 / ⌘-F8 или выберите ‘Отладка’ > ‘Переключение точек останова на строке’
    3. В окне ‘Проекты’ перейдите к узлу текущего проекта, щелкните правой кнопкой мыши и выберите ‘Отладка’ во всплывающем меню. Среда IDE открывает окна отладки и выполняет проект в отладчике до достижения установленной точки останова.
      Примечание. Если текущий проект настроен как ‘Главный’ выберите ‘Отладка’ > ‘Отладка главного проекта’ или нажмите Ctrl-F5, или щелкните .
    4. Перейдите в окно «Local Variables». В данном окне показаны все переменные, которые инициализированы внутри текущей функции, их типы и их значения.
    5. Для просмотра значения переменной отдельно от функции переместите курсор на отображаемую переменную. Подсказка показывает значение переменной.
    6. Для построчного выполнения программы (включая строки внутри всех вызванных функций) нажмите F7 или выберите «Debug > StepInto» и наблюдайте за изменениями значений переменных в окне «Локальные переменные».
    7. Для проверки логики программы путем наблюдения за изменениями выражений определите новый параметр наблюдения:
      1. Для открытия окна «Watches » выберите путь «Window > Debugging > Watches» или нажмите сочетание клавиш Ctrl-Shift-2. Откроется окно «Watches».
      2. Щелкните окно «Watches» правой кнопкой мыши и выберите «New Watch» во всплывающем меню. Откроется окно «New Watch».
      3. Введите наблюдаемое выражение и нажмите OK.

      Теперь в течение отладки можно выполнить дополнительную проверку.

      Важно! Для установки точек наблюдения необходимо включить точки наблюдения на вкладке Debugging («Отладка») параметров PHP.

      После завершения программы окна отладки закрываются.

      Пример сеанса отладки

      Пример в этом разделе иллюстрирует базовые функции отладчика, включая вход в функции и перешагивание через них. Кроме того, в нём показан типичный вывод окна отладчика.

      1. Создайте новый проект PHP со следующими параметрами:
        • Тип проекта – приложение PHP
        • Расположение исходных файлов – по умолчанию папка htdocs
        • Настройка выполнения – локальный веб-сайт

        Для получения более подробной информации о настройке проекта PHP см. Настройка проекта PHP.

      2. Для активации возможности использования «горячих» клавиш во время сеанса установите курсор на узел проекта и выберите «Set as Main Project» во всплывающем меню.
      3. Введите следующий код в файле index.php: Этот код содержит три функции:
        • функция calculate_factorial ();
        • функция calcualte_sum ();
        • функция calculate_sum_of_factorials () (дважды вызывает функцию calculate_factorial, затем однократно вызывает функцию calcualte_sum () и возвращает рассчитанную сумму факториалов).
      4. Задайте точку останова (Ctrl-F8/⌘-F8) в начале блока PHP:
      5. Для начала отладка щелкните . Отладчик остановится по достижении точки останова.
      6. Нажмите F7 три раза. Отладчик остановится в той строке, в которой вызывается функция calculate_sum_of_factorials (). В окне «Local Variables» отображаются переменные $m и $n с соответствующими значениями:
      7. Нажмите F7 для перехода к функции calculate_sum_of_factorials(). Отладчик начнет выполнение кода внутри функции calculate_sum_of_factorials () и остановится при вызове функции calculate_factorial().

      Теперь в окне «Local Variables» отображаются локальные переменные $argument1 и $argument2, заявленные в функции calculate_sum_of_factorials ().

    8. Нажмите F7. Отладчик начнет выполнение кода с функцией calculate_factorial(). В окне «Call Stack» отображается стек вызовов функций в обратном порядке, начиная с последней вызванной функции:
    9. Нажмите F7 для перехода к циклу. Просмотрите значения переменных в окне Variables («Переменные»).
    10. После подтверждения правильности работы кода нажмите Ctrl-F7/⌘-F7, чтобы отменить выполнение функции. Затем будет выполнен возврат к строке, следующей после строки вызова функции calculate_factorial().
      Примечание. В качестве альтернативы можно нажимать F7 до завершения программой выполнения функции calculate_factorial(). После вызова этой функции также будет выполнен возврат к следующей строке.
    11. Поскольку проверка функции calculate_factorial() была только что выполнена, и известно, что функция работает нормально, ее выполнение можно «пропустить». Для этого нажмите F8. Программа завершит работу при вызове функции calculate_sum().
    12. Для перехода к функции calculate_sum() нажмите F7.
    13. Для этого нажмите F8. В любом случае отладчик остановится на последней строке в функции calculate_sum_of_factorials().
    14. Нажмите F7. Отладчик переместится к строке с оператором echo.
    15. Нажимайте F7 до тех пор, пока отладчик не завершит работу с программой. Откроется окно браузера, в котором отображается результат выполнения программы:

    Использование дополнительных наблюдаемых выражений

    В целях дальнейшего выполнения программы можно определить дополнительное наблюдаемое выражение. Это может способствовать обнаружению ошибок.

    Внимание! Настройка дополнительных точек наблюдения нарушает стабильную работу XDebug. По умолчанию точки наблюдения отключены в параметрах отладки.

    1. Обновите код, как показано ниже (замените знак «плюс» на знак «минус»): Можно предположить, что это следствие неправильного написания кода, но фактически требуется еще раз подсчитать сумму.
    2. Выберите ‘Отладка’ > ‘Создать наблюдение’ или нажмите Ctrl/⌘-shift-F7. Откроется окно «New Watch».
    3. Введите следующее выражение и нажмите «ОК». Новое выражение появится в окне «Watches».
    4. Запустите сеанс отладки. После остановки отладчика остановится в указанной строке: сравните значение выражения в окне «Watches» со значением $result в окне «Local Variables». Эти значения должны совпадать, но они различны.

    Этот пример является простым, однако позволяет получить некоторое представление об использовании наблюдаемых выражений.

    Использование сочетания PHP и HTML

    Дополнительная информация о формах ввода HTML.

  • Замените следующие строки в верхней части блока : на следующий код:
  • Установите точку останова в начале блока и начните сеанс отладки.
  • Нажмите F7. Отладчик перейдет к программе. Откроется окно браузера, но форма ввода в нем не отображается. Это нормальный режим работы отладчика, поскольку для отображения веб-страницы отладчик должен пройти по всему исходному коду. Фактически это означает, что отладчик обрабатывает код дважды. Первый раз обрабатывается код для отображения формы ввода HTML. Второй раз поэтапно обрабатывается код PHP.
  • Нажимайте F7 до тех пор, пока не будет достигнут конец программы; после этого откроется форма ввода.
  • Заполните форму и нажмите Enter. Сеанс отладки будет продолжен, как описано в разделе Пример сеанса отладки.
  • Отображение пути, прокси отладчика и запуск сеанса отладки по пользовательскому URL-адресу

    Отлаживать можно как сценарии, так и веб-страницы, причем отладку веб-страниц можно проводить как локально, так и удаленно. При удаленной отладке к сожалению файл отладки php на удаленном сервере не совпадает с файлом, открытым в IDE NetBeans, запущенном на локальном компьютере. Таким образом, поддержка отладчика в среде IDE NetBeans должна быть способна сопоставлять пути сервера с локальными путями. Однако, в силу различных осложнений, сопоставление путей невозможно разрешить автоматически для каждого отдельного сценария. Следовательно, начиная с NetBeans 6.7, пользвоатели могут вручную определять сопоставление путей с помощью настройки проекта для отдельных конфигураций. Также можно указать прокси-сервер, если таковой имеется, и URL-адрес, с которого начинается сеанс отладки. Если этот URL-адрес не указать, отладка начнется с файла индекса.

    Чтобы настроить сопоставление путей и разрешить использование пользовательских URL-адресов при отладке:

    1. Щелкните правой кнопкой узел проекта в окне Projects («Проекты») и откройте свойства проекта в контекстном меню.
    2. В диалоговом окне ‘Свойства проекта’ перейдите в категорию ‘Конфигурация запуска’.
    3. Нажмите кнопку Advanced («Дополнительные»). Откроется диалоговое окно расширенной настройки сети.
    4. Добавьте путь сервера и путь проекта для сопоставления путей.
    5. В Debug URL («Отладка URL-адреса») выберите один из следующих вариантов (не оставляйте выбор по умолчанию):
    • Ask Every Time («Спрашивать каждый раз»), указывающий среде IDE запрашивать URL-адрес у пользователя при каждом запуске сеанса отладки.
    • Do Not Open Web Browser («Не открывать веб-браузер»), в результате чего придется открыть браузер и ввести URL-адрес вручную (будет необходима переменная GET/POST XDEBUG_SESSION_START).
  • В случае использования для отладки прокси-сервера введите имя узла и порт сервера в разделе Debugger Proxy («Прокси отладчика»).
  • Дополнительные сведения приведены в записи Path Mapping in PHP Debugger («Сопоставление путей в отладчике PHP») блога по Net Beans для PHP.

    Для отправки комментариев и предложений, получения поддержки и новостей о последних разработках, связанных с PHP IDE NetBeans присоединяйтесь к списку рассылки .

    Настройка отладки php-кода при помощи Xdebug

    Xdebug — это расширение для PHP, которое помогает разработчику в отладке php-кода. В отличие от стандартных методов (var_dump, print_r и пр.), оно позволяет использовать удалённый отладчик в IDE построчно через брейк-пойнты. Данный метод поможет отследить значения переменных и ускорит процесс поиска ошибок в коде.

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

    Для работы мы выбрали две IDE: PhpStorm и VSCode, так как они являются одними из самых распространённых, а также, чтобы был выбор между платной (PHPStorm) и бесплатной (VSCode) средой разработки.

    Шаг 1: Настройка работы в режиме CGI

    Зайдите в панель управления хостингом в раздел «Домены» и переключите php в режим CGI при помощи панели, расположенной справа от названия Вашего сайта. Необходимо выбрать «Стандартный режим».

    Дальше нужно добавить следующие опции (сначала идёт название, через тире — значение):

    1. zend_extension — /usr/local/php-profilers/xdebug/php-version/xdebug.so
      Пропишите версию php, которую Вы используете в данный момент. Вот возможные пути:
      • /usr/local/php-profilers/xdebug/php-5.2/xdebug.so
      • /usr/local/php-profilers/xdebug/php-5.3/xdebug.so
      • /usr/local/php-profilers/xdebug/php-5.4/xdebug.so
      • /usr/local/php-profilers/xdebug/php-5.5/xdebug.so
      • /usr/local/php-profilers/xdebug/php-5.6/xdebug.so
      • /usr/local/php-profilers/xdebug/php-7.0/xdebug.so
      • /usr/local/php-profilers/xdebug/php-7.1/xdebug.so
      • /usr/local/php-profilers/xdebug/php-7.2/xdebug.so
    2. xdebug.profiler_enable — 1
    3. xdebug.profiler_enable_trigger — 1
    4. xdebug.remote_host — 127.0.0.1
    5. xdebug.remote_port — 8015
      Вы можете прописать любой порт, только необходимо его запомнить для дальнейших настроек в IDE
    6. xdebug.idekey — PHPSTORM, либо VSCODE (в зависимости от той, какую Вы планируете использовать)
    7. xdebug.remote_enable — 1
    8. xdebug.remote_handler — dbgp
    9. xdebug.remote_mode — req
    10. xdebug.remote_autostart — 1
    11. xdebug.show_local_vars — 1
    12. xdebug.overload_var_dump — 1
    13. xdebug.max_nesting_level — 200
    14. xdebug.extended_info — 1

    Дальше нажмите Сохранить конфигурацию и подождите. Чтобы настройки подхватились необходимо около 5-10 минут.

    Cоздайте 3 файла на сервере через файловый менеджер панели управления хостингом:

    1. php.ini в любой удобной для Вас директории
    2. .htaccess в папке /domain-name.ru/htdocs/www/, где domain-name.ru — имя Вашего домена
    3. php.cgi в папке /domain-name.ru/htdocs/www/cgi-bin/, где domain-name.ru — имя Вашего домена

    Добавьте в файл .htaccess содержимое:

    Установите на файл php.cgi права 0755 (rwxr-xr-x) и пропишите в файле следующие директивы:

    php-version — версия php, которую Вы используете. Вот возможные пути:

    Наполните файл php.ini следующим содержимым:

    В примере выше мы прописали путь к файлу расширения Xdebug, который по умолчанию уже лежит в дирекитории /usr/local/php-profilers/xdebug/php-version/ (php-version — Вы прописываете версию php, с которой работаете, например, php-7.1)

    Мы выбрали порт 8015 (remote_port) для примера. Вы можете использовать любой, только запомните его, так как он ещё понадобится.

    Для того, чтобы проверить, подхватились ли настройки, создадим файл myFile.php в директории /home/hostXXXXXX/domain-name/htdocs/www/ и выведем информацию с помощью функции phpinfo():

    Далее откройте файл в браузере и убедитесь, что всё работает:

    Шаг 2: Создание ssh-туннеля

    Для обеспечения совместной работы xDebug и используемой IDE, необходимо создать «туннель» к серверу с локального компьютера.

    Вначале необходимо сгенерировать пару ключей ssh в папке .ssh/ на локальной машине:

    Затем копируете содержимое файла id_rsa.pub (локальная машина) и, создав новый файл authorized_keys на сервере в директории /home/hostXXXXXXX/.ssh/ через файловый менеджер панели управления, сохраняете в нём данное содержимое.

    После чего можно создать ssh-тунель командой на Linux и OS X:

    Для работы потребуется программа PuTTY — её можно скачать с официального сайта

    После того как Вы её скачаете, из архива распакуйте папку PuTTY Portable, будем работать с ней. В папке PuTTY Portable найдите файл puttygen.exe и запустите его.

    Тип ключа для генерации выберите SSH-2 RSA,
    Длина генерируемого ключа(в битах) — 2048

    Жмём Сгенерировать. Хаотично перемещайте курсор мыши внутри окна программы. Введите желаемый комментарий к созданным ключам, чтобы Вам было удобнее различать созданные ключевые пары в будущем.

    Сохраните открытый и личный (закрытый) ключ, не перепутайте ключи в будущем. (Рекомендуем открытым ключам давать расширение .pub, а закрытым .ppk)

    Не закрывая окно программы генерации ключей, скопируйте открытый ключ и, создав новый файл authorized_keys на сервере в директории /home/hostXXXXXXX/.ssh/ через файловый менеджер панели управления, сохраните в нём содержимое открытого ключа.

    Перейдя во вкладку Connection → SSH → Auth, загрузите файл сохраненного закрытого ключа, как показано на скриншоте ниже:

    Для настройки туннеля нужно указать имя сервера либо его IP (вкладка Session). Порт по умолчанию изменяем на 1024, протокол оставляем SSH и нажимаем Save:

    Во вкладке Connection → Data вводим ваш логин (имя аккаунта hostXXXXXXX):

    После этого нужно открыть вкладку Connection → SSH → Tunnels и настроить так, как указано на скриншоте:

    Возвращаемся в раздел Session, нажимаем кнопку Open и на запрос Putty о корректности ключей (только при первом подключении), нужно ответить Да (Yes). Для дальнейшего использования настроек, просто открывайте Putty в меню сохраненных сессий и, выбрав нужную, нажимаете Load и наконец Open

    Шаг 3: Настройка IDE

    IDE PHPStorm можно скачать с официального сайта.

    Для начала, создайте новую пустую папку и откройте её в редакторе. Далее, заходим в настройки: File → Settings

    1. Languages & Frameworks → PHP → Debug: Пропишем порт для соединения с сервером, который мы ранее указали в php.ini или прописали через панель управления. В нашем случае, это порт 8015
    2. Languages & Frameworks → PHP → Debug → DBGp Proxy
      IDE key — PHPSTORM
      Host — название вашего домена (domain_name)
      Port — ещё раз укажем порт 8015
    3. Languages & Frameworks → PHP → Servers
      Чтобы добавить соответствие путей на Вашем компьютере и удалённом сервере, нажмите значок «+» вверху слева Add(insert)
      Name — указываем рандомное имя, к примеру testdev.com
      Host — название вашего домена (domain_name)
      Post — 80
      Ставим галочку в чекбоксе Use path mappings и прописываем соответствие пути к только что созданной папке на локальной машине и абсолютного пути к рабочим файлам на сервере, к примеру:
    4. Build, Execution, Deployment → Deployment
      В данном пункте настроим SFTP соединение с нашим сервером. Для этого также необходимо добавить новое соединение, нажав на значок «+» вверху слева и выбрать TypeSFTP, Name можно выбрать рандомный, к примеру xDebugTest
      SFTP host — указываем название вашего домена
      Port — 1024
      Root path/home/hostXXXXXXX (номер Вашего аккаунта)
      User Name — вводим номер своего аккаунта hostXXXXXXX
      Auth type — выбираем Key pair (OpenSSH or PuTTY) из выпадающего списка
      Private key file — указываем путь до приватного ssh-ключа (id_rsa), предварительно скачанного с нашего сервера из папки /home/hostXXXXXXX/.ssh/
      Web server root URL — прописываем корневой URL к Вашему сайту
      Чтобы проверить, настроили ли Вы соединение правильно, нажмите на кнопку Test SFTP connection. В следующей вкладке Mappings укажем каталог, в котором будут располагаться файлы проекта локально и соответствующую директорию на сервере (можно пользоваться функцией обзора файловой системы):
    5. Languages & Frameworks → PHP
      PHP language level — выбираем версию php, используемую Вами в проекте
      CLI Interpreter добавляем интерпретатор для обработки php-скриптов:
      Name — можно указать рандомное, к примеру Remote PHP
      Выбираем radio-button Deployment configuration и находим наше новое SFTP-соединение
      В пункте PHP executable прописываем путь до исполняемого файла на сервере /home/hostXXXXXXX/ domain_name/ htdocs/www/ sys-php-cgi/ php_wrapper.cgi и нажимаем Apply

    IDE VSCode можно скачать с официального сайта.

    Нам понадобится скачать 2 расширения. Это можно сделать прямо из приложения:

    1. Sync-Rsync (для упрощения работы с удалённым сервером)
      Его можно скачать, открыв в программе VSCode панель Расширения и набрав в поисковой строке sync-rsync
    2. PHP Debug, которое и будет «дебажить» наши php-скрипты

    Далее, создаём пустую папку в любой удобной для Вас директории на локальной машине и открываем её в VSCode через верхнее меню: Файл → Открыть папку

    Добавим в нее подпапку .vscode и создадим в ней новый файл settings.json, в котором пропишем настройки для расширения sync-rsync:

    /home/user/.ssh/id_rsa — это путь до сгенерированного на втором шаге закрытого ключа на локальной машине.

    Сохраните файл, затем нажмите F1, введите в поисковую строку sync и выберите из выпадающего списка пункт Sync Remote to Local — это действие автоматически скопирует файлы с сервера в Вашу локальную папку:

    После этого нажмите на значок отладки (1) и на иконку с маленькой шестеренкой (2):

    В папке .vscode автоматически создастся файл launch.json, в которм нужно исправить и дописать следующее:

    Настройка VSCode завершена.

    Приложение настроено. Переходим к последнему шагу — тестирование.

    Шаг 4: Start Debugging

    Для просмотра файлов Вашего домена выбираем в верхнем меню Tools → Deployment → Browse Remote Host

    Найдём ранее созданный файл myFile.php и скачаем его к себе в локальную папку, нажав на файл правой кнопкой мыши и выбрав пункт Download from here

    Открыв файл из локальной папки, дополним его содержимое следующим кодом (phpinfo() можно удалить):

    Сохранив файл загрузим его обратно на сервер в уже изменённом виде: нажмите правой кнопкой на файл и выберите пункт

    Проверим, что содержимое изменилось, открыв сайт в браузере http://domain_name/myFile.php. Вы должны увидеть следующее:

    Далее, убедившись, что ssh-тунель всё ещё открыт, ставим точку останова рядом со строкой «foreach ($arr as &$value) <» и нажимаем значок вверху справа для «прослушивания соединения» (Start Listening for PHP Debug Connections), перезагружаем страницу сайта.

    Если всё было сделано правильно, Вы должны увидеть следующее:

    Заменим содержимое файла myFile.php на следующее:

    Загрузим изменённый файл на сервер: нажмите F1 и введите в строке команду Sync-Rsync: Sync Local to Remote

    Откроем файл в браузере на сервере и перед тем, как начать debug, ещё раз убедимся, что ssh-тунель между машинами открыт.

    После этого в VScode расставим точки останова, просто нажав слева от тех строк, которые Вам необходимы. Ещё раз выберем режим Отладка, убедимся, что выделен пункт Listen for XDebug и нажмём значок зелёного треугольника, либо кнопку F5 на клавиатуре.

    Перезагрузив сайт в браузере, вернёмся в VSCode. Если всё было сделано верно, Вы должны увидеть глобальные переменные, их значения, а также иметь возможность перемещаться по коду и смотреть, как меняются значения переменных на каждом шаге:

    Визуализация логов профайлера c помощью WebGrind

    WebGrind это графический интерфейс для анализа и просмотра файлов трассировки Xdebug. Другими словами, это набор php скриптов, которые можно установить на сервер и использовать для удобного вывода статистики прямо в Вашем браузере. Можно просматривать список функций которые вызывались, количество вызовов (Invocation Count), общее время потраченное на вызов (Total Self Cost) и общее время потраченное на выполнение (Total Inclusive Cost).

    Для начала работы с WebGrind скачайте его с официальной страницы на Github по ссылке, распакуйте архив в панели управления через файловый менеджер в корне Вашего сайта /home/hostXXXXXXX/domain-name/htdocs/www/ и добавьте в php.ini две дополнительных директивы:

    • xdebug.profiler_output_dir/home/hostXXXXXXX/donain-name/путь_до_папки_с_логами
    • xdebug.profiler_output_namecachegrind.out.%p

    xdebug.profiler_output_dir — это путь до папки, где Вы хотите хранить лог-файлы (предварительно её нужно создать).

    Далее, зайдите в распакованную папку webgrind-master и отредактируйте файл config.php

    Теперь запустите любой php-скрипт в браузере и перейдите по ссылке www.domain-name/webgrind-master. Выберите из выпадающего списка запущенный только что скрипт и нажмите update. Вы увидите примерно следующее:

    Можно скрыть php функции или перейти внутрь функций, чтобы увидеть развернутую статистику, а также посмотреть графы вызова функций, нажав на

    По окончании отладки приложения и запуска проекта «в бой» не забудьте отключить отладку скриптов, ввиду того, что отладчик может существенно замедлять работу Вашего сайта.

    Удачной работы! Если возникнут вопросы — напишите нам, пожалуйста, тикет из панели управления хостингом, раздел «Помощь и поддержка».

    Найдите ошибки в PHP-приложениях при помощи Xdebug

    Лучше использовать PHP-отладчик, чем echo с var_dump(), debug_zval_dump() и print_r()

    Хотя PHP можно использовать для создания сценариев командной строки для таких задач как системное администрирование и традиционная обработка данных, мощь языка особенно проявляется в Web-приложениях. В данной статье каждое PHP-приложение размещается на сервере и активизируется через прокси, такой как Apache, для обработки входящих запросов. Для каждого запроса за короткое время выполняется обычное PHP Web-приложение, выдающее Web-страницу или структуру XML-данных.

    Учитывая кратковременность выполнения Web-приложений и их уровневую конструкцию (клиентское приложение, сеть, HTP-сервер, прикладной код и применяемая база данных), отловить баги (bugs) в PHP-коде может быть непросто. Даже если предположить, что все уровни, за исключением PHP-кода, работают безупречно, трассировка до обнаружения ошибки в PHP-коде может быть трудной, особенно (с некоторой иронией) если приложение использует все больше и больше классов.

    PHP-выражение echo и функции var_dump() , debug_zval_dump() и print_r() являются обычными и очень популярными средствами отладки, помогающими решить различные проблемы. Однако как средства расследования эти выражения (и даже более надежный инструментарий, например, пакет PEAR Log) предоставляют доказательства, которые вы должны анализировать априори и вне контекста.

    Кроме того, отладка посредством дедукции является подходом с позиции «грубой силы». Вы собираете данные и просеиваете их, пытаясь понять, что произошло. При отсутствии необходимой информации вы должны переделать ваш код, повторить предыдущие действия и начать исследование заново. Намного более эффективная стратегия — испытывать приложение во время его работы. Можно каталогизировать параметры запроса, просмотреть стек вызовов процедур, узнать значение любой переменной или объекта. Можно временно прервать выполнение приложения и получить уведомление об изменениях значения переменной. В некоторых случаях можно фактически интерактивно изменять переменные, задавая вопрос «Что если?».

    Такое «живое» или интерактивное исследование обеспечивается специальным приложением, называемым отладчиком. Отладчик запускает или подключается к процессу для управления им и исследования его памяти. Либо, в случае с интерпретируемыми языками, отладчик может непосредственно интерпретировать код. Типичный современный отладчик может индексировать и просматривать исходный код, отображать сложные структуры данных в читабельном виде и одновременно отображать состояние программы, стек вызовов, выводимые программой данные и значения всех переменных. Например, для отладчика обычным является каталогизация и отображение свойств и методов класса.

    В этой и следующей статьях я познакомлю вас с инструментальными средствами, которые непременно упростят PHP-отладку. В следующий раз я сконцентрируюсь на интерактивной отладке и программе Zend Debugger (надежном отладчике, специально разработанном для PHP), а также рассмотрю множество функций, которые он предлагает (Zend Debugger — это коммерческий продукт, предоставляемый как часть Zend PHP Integrated Development Environment (IDE)). Также я рассмотрю PHP-отладчик с открытым исходным кодом, если вы предпочитаете тратить деньги на пиво, а не на программы. В данной статье я сконцентрируюсь на сборе более качественных доказательств.

    Как в сериале C.S.I., но применительно к компьютерам

    Когда код становится неправильным, не давая ожидаемого результата или не работая вовсе, вы хотели бы получить ответ на четыре вопроса: где, что, почему и когда.

    • «Где» — номер строки (и в каком она файле), после которой выполнение приложения прекратилось.
    • «Что» привело код в негодность — подозреваемый, так сказать.
    • «Почему» – в чем природа ошибки. Возможно, это логическая ошибка, ошибка, вызванная взаимодействием с операционной системой, или то и другое.
    • «Когда» — контекст, в котором возникла ошибка. Что случилось непосредственно перед гибелью программы? Как и в любом преступлении, улики могут изобличить преступника, если собрать достаточное их количество.

    Средство для проведения расследования Xdebug (использовалось в предыдущей статье для профилирования производительности PHP-приложения), как следует из его названия, предоставляет несколько функциональных возможностей для отображения состояния программы и является ценным исследовательским инструментом, который должен быть в вашем наборе (см. раздел «Ресурсы»). Будучи установленным, Xdebug вмешивается в процесс для предотвращения бесконечных рекурсий, добавляет в сообщения об ошибках информацию о трассировке стека и функций, следит за распределением памяти, а также выполняет некоторые другие функции. Xdebug содержит также набор функций, которые вы можете добавить в свой код для получения диагностических данных времени выполнения.

    Например, приведенный ниже код использует горстку процедур xdebug_. () для оснащения функции callee() возможностью вывода точного месторасположения вызывающей функции, включая имя файла, номер строки и имя функции.

    Листинг 1. Процедуры для оснащения функции callee() новыми возможностями

    Этот код выводит:

    Компоновка и установка Xdebug

    Xdebug без труда компонуется из исходных кодов в UNIX®-подобных операционных системах, в том числе Mac OS X. Если вы используете PHP в Microsoft® Windows®, можете загрузить модуль Xdebug в бинарном виде для последних версий PHP с Web-сайта Xdebug (см. раздел «Ресурсы»).

    Давайте выполним компоновку и установим Xdebug для Debian «Sarge» Linux® и PHP V4.3.10-19. На момент написания данной статьи новейшей версией Xdebug является V2.0.0RC4, выпущенная 17 мая 2007 года. Для работы вы должны иметь служебные программы phpize и php-config, а также возможность изменять системный конфигурационный файл php.ini (если этих программ у вас нет, обратитесь на PHP.net за исходными кодами и инструкциями по компоновке PHP с нуля). Выполните следующие действия:

    1. Загрузите Xdebug tarball (сжатый gzip .tar-архив). Это очень сделать просто при помощи команды wget :
    2. Разархивируйте tarball и перейдите в каталог с исходным кодом:
    3. Запустите phpize , чтобы подготовить код Xdebug для вашей версии PHP:
      Результатом работы phpize является сценарий (очень к месту названный configure), используемый для настройки остального процесса компоновки.
    4. Выполните сценарий настройки:
    5. Выполните компоновку расширения Xdebug, запустив make :
      Результатом работы make является расширение Xdebug, xdebug.so.
    6. Установите расширение:
      Перед продолжением работы выделите и скопируйте каталог, который отобразила последняя команда. Этот путь очень важен для конфигурирования расширения на последнем шаге.
    7. Откройте файл php.ini в любимом текстовом редакторе и добавьте следующие строки:
      Первая строка загружает расширение Xdebug; вторая запрещает функциональность профайлера в Xdebug (для упрощения), а третья разрешает функциональные возможности отладки.

    Для проверки корректности установки и разрешения работы расширению Xdebug перезапустите ваш Web-сервер, затем создайте простое однострочное PHP-приложение с кодом . Если вы укажете адрес файла в браузере (например, http://localhost/phpinfo.php) и прокрутите выведенную информацию вниз, то увидите что-то похожее на рисунок 1.

    Рисунок 1. Проверка корректности установки и работы расширения Xdebug

    Примечание: Если раздела Xdebug нет в phpinfo() , Xdebug не загрузился. log-файлы ошибок вашего сервера Apache могут указать причину. К обычным ошибкам относится неправильный путь для zend_extension или конфликт с другим расширением. Например, если вы хотите использовать XCache и Xdebug, первым загружайте XCache. Однако, поскольку Xdebug предназначен для использования во время разработки и предполагая, что путь к xdebug.so указан правильно, запретите другие расширения и попробуйте еще раз. Затем можно повторно разрешить расширения для выполнения других проверок, например, эффективности кэширования. На сайте Xdebug приведены также некоторые другие советы по решению возможных проблем.

    Конфигурирование Xdebug

    Директивы (в самом левом столбце большой таблицы на рисунке 1) — это только некоторые из параметров, которые можно установить для изменения поведения расширения Xdebug. Все директивы указываются в файле php.ini. Некоторые из них конфигурируют средства отладки, другие настраивают работу профайлера. Игнорируя последние, давайте настроим Xdebug так, чтобы он помогал отлаживать PHP-код.

    Ограниченная рекурсия

    При использовании рекурсии (например, для вычисления чисел Фибоначчи) и некорректном указании условий завершения приложение может выполняться очень долго до тех пор, пока не использует все выделенное время или память. Для ограничения глубины рекурсии можно настроить параметр xdebug.max_nesting_level . Например, xdebug.max_nesting_level = 50 ограничивает рекурсию глубиной в 50 вложенных вызовов до принудительного завершения приложения. Для демонстрации выполните следующий код с разрешением работы Xdebug.

    Листинг 2. Ограничение рекурсии

    Функция deep_end() совершенно буквально ведет в глубокий тупик. Xdebug вмешивается в процесс после 49 вызовов функции и выдает информацию, приведенную на рисунке 2 (кстати говоря, начальная активизация main() для запуска программы считается первым фреймом).

    Рисунок 2. Xdebug завершает выполнение, если стек вызовов превышает его граничное значение

    Если приложение использует рекурсию интенсивно для решения больших проблем методом «разделяй и властвуй», соответственно установите значение этого параметра «поглубже». В противном случае установите xdebug.max_nesting_level в номинальное значение для более быстрого прекращения вышедших из под контроля последовательностей вызовов функций.

    Ответы на четыре простых вопроса

    При возникновении ошибок нужно ответить на четыре вопроса. Xdebug может предоставить всю нужную информацию, причем немедленно. Вот для начала несколько полезных настроек; их можно настроить более точно в любое время.

    Листинг 3. Ошибки

    Настройки xdebug.dump_once , xdebug.dump_globals , xdebug.dump_undefined и xdebug.dump_SUPERGLOBA L (где SUPERGLOBAL может быть COOKIE , FILES , GET , POST , REQUEST , SERVER или SESSION ) управляют тем, какие суперглобальные переменные PHP включаются во все диагностические результаты.

    Установите xdebug.dump_globals в значение On для вывода суперглобальных переменных, перечисленных в настройках xdebug.dump_SUPERGLOBAL . Например, xdebug.dump_SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT выводит суперглобальные переменные PHP $_SERVER[‘REQUEST_METHOD’] , $_SERVER[‘REQUEST_URI’] и $_SERVER[‘HTTP_USER_AGENT’] . Если вы хотите вывести все значения массива superglobal, используйте символ звездочки (*), например, xdebug.dump_REQUEST=* . Если вы установите xdebug.dump_undefined в значение On и не установите именованную переменную superglobal, она все равно выводится со значением undefined .

    Строка xdebug.show_exception_trace = On разрешает трассировку исключительных ситуаций, даже если вы перехватили исключительную ситуацию. Строка xdebug.show_local_vars = 1 выводит все локальные переменные самой внешней области видимости каждого вызова функции, включая еще не инициализированные переменные. А xdebug.var_display_max_depth = 6 указывает глубину вывода комплексной переменной.

    Объединение всех настроек

    В листинге 4 показаны все важные настройки для Xdebug в файле php.ini.

    Листинг 4. Настройки для файла php.ini

    Сохраните эти настройки в файле php.ini, а затем перезапустите ваш Web-сервер.

    Интерпретация данных дампа

    В следующем примере продемонстрировано, что происходит при возникновении ошибки. Измените код «off-the-deep-end» для соответствия листингу 5.

    Листинг 5. Измененный ошибочный код

    При выполнении этого нового кода, вы должны увидеть значительно больше информации, как показано ниже.

    Рисунок 3. Дамп суперглобальных, локальных переменных и переменных при ошибке

    Текст передаваемого в trigger_error сообщения показан вверху. Внизу расположен список запрошенных элементов $_SERVER и список определенных элементов $_REQUEST . В самом внизу находится список переменных области видимости #48 , что является вызовом deep_end() , согласно манифесту. В этом вызове переменная $count имела значение integer 48. С такой конфигурацией Xdebug вы теперь имеете больше улик для поиска преступника.

    Вот еще один совет: Xdebug предоставляет расширенную функцию var_dump() , которая особенно полезна для массивов и классов PHP. Например, в листинге 6 приведен простой (PHP V4) класс и экземпляры.

    Листинг 6. Класс и экземпляры PHP V4

    А в листинге 7 показана информация, выводимая функцией var_dump() .

    Листинг 7. Вывод var_dump()

    При использовании Xdebug с классами PHP V5 в дамп входят такие атрибуты как public , private и protected .

    Трассировка кода

    Исправление ошибки в коде (также как и раскрытие убийства) часто требует воссоздания подробной временной шкалы. Например, утечка памяти обычно не проявляет себя как ошибочная ситуация. Напротив, операции выполняются нормально до тех пор, пока не закончится память и приложение внезапно не завершится. Если утечка памяти происходит из-за конкретных запросов, ошибки могут проявляться не всегда, и их будет сложно прогнозировать. Отображение использования памяти во времени показало бы серьезность утечки. Подробная временная шкала (например, от функции к функции) могла бы указать на источник утечки.

    Xdebug может обеспечить вывод подробной временной шкалы как трассировки выполнения. При разрешенной трассировке Xdebug регистрирует каждый вызов функций, включая аргументы функции и возвращаемое значение. Можно отформатировать каждый log-файл для более удобного его восприятия человеком или машиной. Первый вариант вы можете просматривать сами, а для второго можно написать отдельное приложение для анализа.

    Так же как и для дампов, Xdebug имеет несколько параметров для настройки трассировки в php.ini. Следующие настройки, например, обеспечивают вывод наиболее подробной информации:

    Листинг 8. Настройка трассировки

    Настройка xdebug.auto_trace = 1 автоматически разрешает трассировку до выполнения любого PHP-сценария. В качестве альтернативы можно установить xdebug.auto_trace = 0 и использовать функции xdebug_start_trace() и xdebug_stop_trace() из вашего кода для разрешения и запрета трассировки соответственно. Однако если xdebug.auto_trace установлен в значение 1 , можно начать трассировку до включения сконфигурированного auto_prepend_file .

    Параметры xdebug.trace_ouput_dir и xdebug.trace_output_name управляют тем, где сохраняется информация трассировки. В данном примере все файлы сохраняются в /tmp/traces, и каждый файл начинается с trace , за которым следует имя PHP-сценария ( %s ) и идентификатор процесса ( %p ). Названия всех файлов трассировки Xdebug заканчиваются суффиксом .xt .

    По умолчанию Xdebug отображает поля времени, использования памяти, имени функции и глубины вызова функции. Если установить xdebug.trace_format в значение 0 , информация выводится в виде, удобном для чтения человеком (для машинного формата используется значение 1 ). Кроме того, можно обнаружить рост или уменьшение использования памяти при указании xdebug.show_mem_delta = 1 , а тип и значения входящих параметров можно выводить, указав xdebug.collect_params = 4 . Для отслеживания значения, возвращаемого каждой функцией, установите xdebug.collect_return = 1 .

    Пришло время другого примера. Создайте каталог /tmp/traces, измените его атрибуты на world-readable и world-writable при помощи mkdir /tmp/traces; chmod a+rwx /tmp/traces (если вы сомневаетесь в том, нужно ли делать этот каталог доступным для всех, по крайней мере, сделайте его доступным для пользователя Web-сервера — обычно www или nobody). Добавьте в файл php.ini указанные выше настройки, перезапустите Web-сервер и снова укажите в адресной строке браузера приложение phpinfo() . Информация трассировки должна выглядеть примерно так, как показано в листинге 9.

    Листинг 9. Полная трассировка

    Здесь main() вызывает phpinfo() , которая возвращает TRUE . Когда завершается main() , она возвращает 1 . Затем, укажите в адресной строке PHP-приложение «deep end» или какое-то другое для генерирования более реальной трассировки.

    В листинге 10 показана трассировка PHP-генератора чисел Фибоначчи из предыдущей статьи, вычисляющего четыре числа Фибоначчи:

    Листинг 10. Трассировка PHP-генератора чисел Фибоначчи

    В первом столбце показано время, во втором — суммарное использование памяти, в третьем — инкрементное использование памяти, в четвертом — вызовы функций, включая параметры.

    Строки, отмеченные символами >=> , показывают возвращаемое значение из каждой функции (для сопоставления вызова функции с возвращаемым ею значением нужно найти -> с соответствующим отступом). Опять же, последнее значение >=> 1 является значением, возвращаемым функцией main() .

    Для vim его автор Xdebug Дэрик Ретанс (Derick Rethans) предоставляет набор правил цветового выделения синтаксиса для файлов трассировки Xdebug. Эти правила содержатся в файле xt.vim в пакете исходных кодов Xdebug. В современных дистрибутивах Linux просто скопируйте xt.vim в $VIMRUNTIME/syntax/xt.vim, а затем запустите vim tracefile.xt . На рисунке 4 показана трассировка генератора чисел Фибоначчи с цветовым выделением в vim.

    Рисунок 4. Синтаксический файл vim для файлов трассировки Xdebug облегчает анализ

    Надоедливые PHP-паразиты в опасности

    Исправление ошибок в PHP-коде может быть не простой задачей. Но если у вас есть система разработки, и вы можете установить Xdebug, уничтожить эти баги становится намного проще. Xdebug может показать трассировку стека, вывести дамп даже комплексных переменных, проследить использование памяти во времени и выполнить эффективное посмертное вскрытие при возникновении ошибки или аварии (не если, а когда).

    Ресурсы для скачивания

    Похожие темы

    • Оригинал статьи «Squash bugs in PHP applications with Xdebug» (EN).
    • Посетите Xdebug.org (EN).
    • Документация по Xdebug (EN).
    • Дополнительная информация по использованию Xdebug приведена в статье developerWorks «Как сделать PHP-приложения быстрыми, еще более быстрыми, самыми быстрыми, часть 2: Профилирование PHP-приложения для поиска, диагностирования и ускорения медленного кода» (EN).
    • Загрузите расширение Xdebug.
    • PHP.net — центральный ресурс для PHP-разработчиков (EN).
    • «Рекомендованный список для чтения по языку PHP» (EN).
    • Усовершенствуйте свои навыки в PHP-программировании, используя ресурсы IBM developerWorks PHP project (EN).
    • Вещательные программы developerWorks — интересные интервью и дискуссии для разработчиков программного обеспечения (EN).
    • Используете базы данных в PHP? Обратите внимание на Zend Core for IBM, цельную, готовую к использованию, легкую в установке интегрированную среду разработки на PHP, поддерживающую IBM DB2 V9 (EN).
    • Раздел developerWorks Open source с исчерпывающей информацией how-to, инструментальными средствами и обновлениями проектов, помогающей использовать в разработке технологии с открытым исходным кодом и продукты IBM .
    • Разработайте ваш следующий проект с открытым исходным кодом, используя пробное программное обеспечение IBM, доступное для загрузки или на DVD.(EN)
    • Загрузите оценочные версии продуктов IBM и используйте инструментальные средства разработки приложений и программы промежуточного уровня DB2®, Lotus®, Rational®, Tivoli® и WebSphere®.

    Комментарии

    Войдите или зарегистрируйтесь для того чтобы оставлять комментарии или подписаться на них.

    Илон Маск рекомендует:  Что такое код globalflags
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL