![]() |
[php + xdebug] Необычная конфигурация и... какой-то парадокс
Для отладки сайта подготовил такую конфигурацию.
1.Сервер разработки (Linux + nginx + php-fpm + xdebug) развёрнут на гостевой машине (с помощью Virtual Box) 2.Все файлы сайта физически хранятся на хост-машине (Windows 10), а в гостевой машине директория сайта mount'ится (используется функционал Virtual Box по созданию общих папок) 3.PHPStorm установлен также на хост-машине, отладка кода выполняется на хост-машине 4.Средствами Virtual Box с помощью NAT-сети настроен проброс порта со 127.0.0.1:80 хост-машины на 10.0.2.15:80 гостевой машины (10.0.2.15 - это IP гостевой машины в NAT-сети), плюс файл host, чтобы при запросе страниц сайта из хост-машины запросы физически поступали в гостевую машину (на сервер разработки). Запросы нормально работают. Задача заключается в настройке связки PHPStorm + xdebug. PHPStorm работает на хост-машине, xdebug - в гостевой машине. Нужно их подружить. В PHPStorm установил галку "Can accept external connections", указал порт отладки 9999, тот же порт указал в настройках xdebug. также в настройках xdebug прописан [xdebug.remote_connect_back = 1], чтобы xdebug определял ip-адрес клиента отладки (в данном случае клиентом отладки является PHPStorm, работающий на хост-машине) автоматически из полученного запроса. Что имеем (ситуация 1) Если средствами Virtual Box добавить проброс порта с 127.0.0.1:9999 хост-машины на 10.0.2.15:9999 гостевой машины (10.0.2.15 - это IP гостевой машины), то при попытке включения прослушки PHPStorm ругается: "Can't start listening for connections from 'xdebug': Port 9999 is busy". Понятно, почему - порт 9999 слушает Virtual Box (чтобы пробрасывать все запросы с этого порта в гостевую машину). Что имеем (ситуация 2) Убираем проброс порта с 127.0.0.1:9999 хост-машины на 10.0.2.15:9999 гостевой машины. После этого прослушка в PHPStorm включается нормально. Ставим breakpoint и отправляем запрос веб-серверу с параметром XDEBUG_SESSION_START (не важно как - из самого PHPStorm или из браузера с установленным и включенным xdebug-плагином). В итоге на хост-машине имеем: 1) баузер ждёт ответа 2) PHPStorm активирует кнопку "Stop" (красный квадрат) - отсюда делаем вывод, что PHPStorm получил на порт 9999 команду инициализации от xdebug (иначе запрос был бы сразу завершён как при обычном запуске НЕ в режиме отладки) 3) До breakpoint дело не доходит, PHPStorm бесконечно ждёт, браузер тоже ждёт 4) Если в PHPStorm нажать кнопку "Stop" (красный квадрат), то запрос завершается, в браузере отображается HTML-код запрошенной страницы (как при запуске обычного запроса НЕ в режиме отладки) - отсюда делаем вывод, что PHPStorm нормально отправляет xdebug'у (работающему на гостевой машине) запрос на завершение отладки, а xdebug нормально получает этот запрос и отправляет хост-машине HTML-код запрошенной страницы Эти два вывода подтверждаются логами xdebug. После начала сессии отладки: Цитата:
Цитата:
Но тогда почему PHPStorm не получает от xdebug (ждёт бесконечно) состояние в точках останова ? Это можно объяснить тем, что после инициализации сессии отладки PHPStorm не получает ничего на порт 9999. Поэтому и ждёт бесконечно. Но тогда каким образом выполняется успешный коннект между PHPStorm и xdebug (если PHPStorm ничего не получает на порт 9999), о чём прямо написано в логах xdebug ? Парадокс... |
В настройках xdebug вместо
PHP код:
PHP код:
Цитата:
|
Проблема решена. В сабжевой ситуации имело место следующее:
1. PHPStorm нормально получал от xdebug отладочную информацию на порт 9999 (по протоколу dbgp) 2. Выполнение скрипта реально останавливалось (не зависимо от наличия и расположения breakpoint'ов), но останавливалось на 1-й строке главного файла скрипта index.php - по той причине, что в настройках PHPStorm стояла галка "Settings - Languages & Framework - PHP - Debug - Break at first line in PHP scripts". Судя по всему, когда настраивал отладчик, нажал "Break at first line in PHP scripts" в Event log. 3. После остановки выполнения скрипта на 1-й строке index.php PHPStorm не открывал этот файл и не показывал текущую строку выполнения (при этом окно "Debug" и кнопки "Stop", "Resume", "Step Over" и прочие активизировались) - по той причине, что у меня не были установлены правила мэппинга для локального веб-сервера (сервера разработки), работающего в гостевой машине (ранее у меня веб-сервер и xdebug тоже работали на хост-машине и правила мэппинга для сервера разработки были не нужны - соответствие между путями веб-сервера в составе xdebug-запроса и путями к отлаживаемым файлам со стороны PHPStorm было 1:1) PHPStorm искал файл, указываемый в xdebug-запросе, поступающем на порт 9999 (в данном случае - index.php) по тому же пути /home/user/www/site/index.php, который был указан в этом xdebug-запросе. Но поскольку у меня на хост-машине (где работает PHPStorm) файлы сайта расположены в другой директории, нужно было: - включить галку "Settings - Languages & Framework - PHP - Servers - <имя сервера> - Use path mappings" - указать директорию на хост-машине (где работает PHPStorm), соответствующую директории /home/user/www/site/index.php на гостевой машине (на которой работает веб-сервер и xdebug) |
Время: 10:23. |
Время: 10:23.
© OSzone.net 2001-