Как удаленно настроить php

Отладка PHP приложений на удаленном хосте при помощи XDebug и vim в Linux

Введение

В PHP приложениях отладка при помощи var_dump, debug_backtrace и прочих полезных функций не всегда удобна, и возникает потребность в полноценном отладчике. Эта статья — для тех, кто по каким-либо причинам не хочет использовать IDE, поддерживающие отладку PHP приложений из коробки, вроде NetBeans или PhpStorm, а хочет использовать для этих целей vim, и при этом отладка происходит на удаленном хосте.

Для vim существует плагин «DBGp client», но он позволяет нормально отлаживать только в случае, когда пути до всех файлов на удаленной и на локальной машинах одинаковые. Например, если локальной машине у вас есть:
/home/user/application/
/home/user/framework/

а на удаленной машине они расположены в:
/var/www/html/application/
/var/www/framework/

то отладить приложение при помощи «DBGp client» не получится, так как он ничего не знает о другом расположении исходников.

В данной статье мы рассмотрим:

  1. Кратко — настройку всего необходимого для удаленной отладки приложения.
  2. Модификацию плагина для поддержки различных путей.
  3. Кратко — использование отладчика.

Установка

Настраиваем vim на локальном хосте

Внимание: vim должен быть собран с поддержкой python, проверить это можно при помощи «:version«, в выводе должна быть строка «+python».

Устанавливаем и настраиваем Xdebug на удаленном хосте

Установите расширение Xdebug любым удобным для вас способом. Например, на Debian Squeeze это делается просто:
# apt-get install php5-xdebug
А в общем случае, лучше почитать официальную инструкцию по установке.

Настройте подключение к локальному debug-клиенту — для этого в php.ini пропишите следующие строчки, заменив 192.168.1.110 на IP локальной машины (при необходимости порт тоже можно перенастроить):
xdebug.remote_enable = 1
xdebug.remote_port = 9000
xdebug.remote_host = 192.168.1.110

Настраиваем соответствие файлов

Идея простая — при отправке запроса дебагеру (например, на установку breakpoint), мы должны преобразовывать путь на локальном хосте в путь на удаленном хосте, и наоборот, при получении информации от дебагера (например, о том что сейчас он находится на какой-то строке какого-то файла), мы должны сделать обратное преобразование.
Дописываем в конец файла debugger.py следующий код:

А в файл mapping (/home/alexey/mapping — замените на свой путь) записываем соответствие локальный и удаленных директорий, например:
/home/alexey/framework /var/www/framework
/home/alexey/application /var/www/html

Просматриваем код плагина в поисках мест, где от Xdebug приходят имена файла. В итоге, все они сводятся к вызову одного метода — set_srcview, в начало которого мы и добавляем изменение имени файла:

Теперь ищем места, где наоборот от debug-клиента к Xdebug передаются имена файлов. Таких мест два:
1. Класс Debugger, метод run, заменяем строку

2. Класс Debugger, метод mark, заменяем строку:

Уже поправленный debugger.py можно взять тут.

Использование

Запускаем отладку

Чтобы начать отладку web-приложения, необходимо запустить vim и нажать .
Далее, в течение 5 секунд (ниже описано, как увеличить интервал), необходимо запустить какой-либо PHP скрипт, передав GET-ом переменную XDEBUG_SESSION_START со значением 1, например просто открыв соответствующую страницу в браузере, например:
webdev/debug.php?XDEBUG_SESSION_START=1
Альтернативно в php.ini можно задать переменную xdebug.remote_autostart. В таком случае, при запуске любого PHP скрипта, Xdebug будет пытаться подключиться к debug-клиенту.
Подробнее можно прочитать в официальной документации Xdebug.
В итоге должно получиться что-то вроде этого — должен открыться скрипт, который вы запустили:

Читайте также:  Почему stepmania не работает коврик

Окна справа — сверху вниз:

  1. WATCH WINDOW — просмотр контекста
  2. HELP WINDOW — краткое описание возможностей
  3. STACK WINDOW — стек вызова функций
  4. TRACE WINDOW — лог общения debug-клиента c Xdebug, полезно посмотреть если отладка не заработала

Настройка под себя

Таймаут можно задать в том же скрипте, найдя в debugger.py строку:

и заменив 5 на нужное вам количество секунд.
Комбинации клавиш задаются в debugger.vim, например себе я переназначил на нажатие «,dr»:
map ,dr :python debugger_run()
Текст в HELP WINDOW можно поменять в классе HelpWindow, методе on_create.

Навигация по коду
Просмотр текущего состояния
  • Property get ( ) — получить значение переменной (надо поставить курсор на нужную переменную и нажать ).
  • Context get ( ) — получить весь текущий контекст (грубо говоря, все переменные, доступные в данном контексте).
  • Eval (,e) — выполнить произвольное выражение в текущем контексте и получить его значение.

На скриншоте — WATCH WINDOW с выполнеными Context get и Eval:

Установка breakpoints

Toggle breakpoint (:Bp) — установить breakpoint в текущей строке, или удалить, если он уже есть.
На скриншоте — зеленая строка — это строка с breakpoint, красная — это текущая строка:

Источник

Работа с удалёнными файлами

В случае, если опция allow_url_fopen включена в конфигурационном файле php.ini , вы можете использовать URL-адреса HTTP и FTP в большинстве функций, принимающих в качестве параметра имя файла. Также вы можете использовать ссылки в операторах include , include_once , require и require_once (для корректной работы этих функций должна быть включена опция allow_url_include). Дополнительную информацию о поддерживаемых в PHP протоколах вы можете найти в Поддерживаемые протоколы и обёртки.

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

Пример #1 Получение заголовка удалённой страницы

Невозможно открыть удалённый файл.\n» ;
exit;
>
while (! feof ( $file )) <
$line = fgets ( $file , 1024 );
/* Сработает, только если заголовок и сопутствующие теги расположены в одной строке */
if ( preg_match ( «@\ (.*)\ @i» , $line , $out )) <
$title = $out [ 1 ];
break;
>
>
fclose ( $file );
?>

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

Для того, чтобы авторизоваться под пользователем, отличным от ‘anonymous’, вам необходимо указать логин (и, возможно, пароль) в адресной строке, например так: ‘ ftp://user:password@ftp.example.com/path/to/file ‘. (Вы можете использовать этот же синтаксис для доступа к удалённым файлам по HTTP -протоколу, если необходима Basic-аутентификация.)

Пример #2 Сохранение данных на удалённом сервере

Невозможно перезаписать удалённый файл.\n» ;
exit;
>
/* Запись данных. */
fwrite ( $file , $_SERVER [ ‘HTTP_USER_AGENT’ ] . «\n» );
fclose ( $file );
?>

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

Читайте также:  Как лучше настроить экран телевизора

Источник

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

Классические методы отладки на PHP — использование функций error_log, print_r и var_dump. Их проблема в том, что они не помогают отслеживать сам процесс работы кода. Однако с этой задачей справляется Xdebug — один из самых популярных инструментов среди PHP-разработчиков, которые хотят работать, а не страдать.

В этой статье будет рассмотрена отладка PHP с помощью связки Xdebug и VSCode. Если вы пользуетесь PHPStorm, то проблем тоже не будет — настройка выполняется даже проще и быстрее.

Возможности Xdebug

Xdebug — это расширение для PHP, которое позволяет использовать удаленный отладчик в IDE через брейк-пойнты. С его помощью вы можете отслеживать значения переменных. Как итог — ошибки в коде обнаруживаются быстрее, чем при использовании error_log, print_r и var_dump.

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

Кроме того, с помощью Xdebug вы можете проследить, какая часть кода выполняется в процессе запроса. Это дает информацию о том, как хорошо код покрыт тестами.

Подключение Xdebug

Для работы Xdebug PHP должен быть в режиме CGI. Посмотрим на примере хостинга Timeweb, как его включить.

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

Переходим в папку cd-bin сайта:

Создаем символическую ссылку командой:

Остаемся в директории cgi-bin и копируем файл php.ini:

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

Теперь мы можем управлять параметрами PHP директивами в файле php.ini. Он находится в папке cgi-bin. Открываем его и вставляем в конце следующие строки:

Если указанный порт занят, укажите другой. Можно использовать стандартный для Xdebug — 9000. В качестве idekey я указал VSCODE. Если будете настраивать конфигурацию для PHPStorm, впишите его.

Чтобы проверить, работает ли Xdebug, создадим в корне сайта файл Myfile.php со следующим содержимым:

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

Организация удаленного подключения

Чтобы выполнять PHP Debug на локальной машине, нужно настроить связь IDE и сервера через SSH-туннель.

На Linux все выполняется парой команд.

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

На Linux туннель создается командой:

На Windows туннель настраивается через утилиту PuTTY.

  1. На вкладке Session указываем имя сервера и номер порта 1024. Проверяем, чтобы был отмечен протокол SSH.
  2. Переходим в раздел Connection — Data. Указываем логин.
  3. Переходим в раздел Connection — SSH — Tunnels. Указываем параметры так, как указано на скриншоте. Номер порта пишем тот, который используется в конфигурации PHP на сервере.
  4. Возвращаемся в раздел Session и нажимаем на кнопку Open. Подтверждаем корректность ключей (только первый раз).
Читайте также:  Не работает костный мозг у кота

Сессия сохранится под тем именем, которое мы указали в разделе Session. В дальнейшем нужно будет просто запускать ее заново.

Настройка VSCode

Чтобы работать с Xdebug в VSCode, установим два расширения: Sync-Rsync и PHP Debug. Первое нужно для работы с удаленным сервером, второе — для отладки скриптов.

  1. Открываем в VSCode раздел Extensions (можно использовать сочетание клавиш Ctrl+Shift+X).
  2. Находим и устанавливаем расширение Sync-Rsync.
  3. Находим и устанавливаем расширение PHP Debug.

После установки расширений создаем на локальной машине пустую папку и открываем ее через VSCode: «Файл» — «Открыть папку».

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

Путь /home/user/.ssh/id_rsa — это место, где лежит файл с закрытой частью SSH-ключа.

После сохранения файла settings.json нажимаем в VSCode F1, выполняем команду Sync Remote to Local. В локальную папку, указанную в настройках, скопируются все файлы с сервера.

Затем нажимаем на иконку отладки и на шестеренку. В папке .vscode появится файл launch.json. В него тоже нужно внести изменения:

На этом настройка IDE завершена. Можно приступать к тестированию кода.

Debug кода

Мы настроили среду, теперь разберемся, как пользоваться Xdebug.

  1. Изменим содержимое файла Myfile.php, который мы создали при подключении отладчика. Добавим в него функцию, которую хотим проверит ь.
  2. Чтобы загрузить измененный файл на сервер, нажимаем на клавишу F1 и выполняем команду Sync-Rsync: Sync Local to Remote.
  3. Открываем файл в браузере и проверяем, что синхронизация работает.
  4. Расставляем в VSCode брейк-пойнты, которые нужны для отладки.

Переходим в режим «Отладка» и проверяем, что выделен пункт Listen for XDebug. Нажимаем на зеленый треугольник или на клавишу F5.

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

Профилирование с визуализацией результатов

Чтобы использовать Xdebug profiler на полную мощность, установим WebGrind. Это набор скриптов, который выводит статистику в браузере. С его помощью можно посмотреть список вызванных функций, количество вызовов, общее затраченное время на вызов и выполнение.

  1. Скачиваем WebGrind с GitHub.
  2. Загружаем архив на сервер и распаковываем файлы в корне сайта.
  3. Создаем папку, в которой будут храниться логи.
  4. Добавляем в файл php.ini две директивы:

Затем нужно открыть файл config.php, который находится в распакованной папке webgrind-master. В нем отредактируем две строки:

После такой настройки можно выполнять на Xdebug профилирование. Открываем наш тестовый скрипт в браузере. Затем переходим по ссылке www.domain/webgrind-master. В выпадающем списке выбираем только что запущенный скрипт и нажимаем на кнопку Update.

Функции можно скрывать или раскрывать, чтобы посмотреть развернутую статистику. Инструмент также умеет отображать графы вызова функций — для этого используется режим Show Call Graph.

Вывод: когда использовать Xdebug?

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

Источник

Оцените статью