CyraxZ
07-07-2017, 23:33
Для отладки сайта подготовил такую конфигурацию.
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. После начала сессии отладки:
Log opened at 2017-07-07 19:14:10
I: Checking remote connect back address.
I: Remote address found, connecting to 10.0.2.2:9999.
I: Connected to client. :-)
-> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" fileuri="file:///home/user/www/site/index.php" language="PHP" protocol_version="1.0" appid="981" idekey="12155"><engine version="2.2.5"><![CDATA[Xdebug]]></engine><author><![CDATA[Derick Rethans]]></author><url><![CDATA[http://xdebug.org]]></url><copyright><![CDATA[Copyright (c) 2002-2014 by Derick Rethans]]></copyright></init>
<- feature_set -i 1 -n show_hidden -v 1
-> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" command="feature_set" transaction_id="1" feature="show_hidden" success="1"></response>
...
При завершении сессии отладки (жмём кнопку "Stop" в PHPStorm):
<- stop -i 19
-> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" command="stop" transaction_id="19" status="stopped" reason="ok"></response>
-> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" command="stop" transaction_id="19" status="stopping" reason="ok"></response>
<- run -i 20
Log closed at 2017-07-07 19:17:33
Как видно из логов, коннект между PHPStorm и xdebug состоялся успешно.
Но тогда почему PHPStorm не получает от xdebug (ждёт бесконечно) состояние в точках останова ?
Это можно объяснить тем, что после инициализации сессии отладки PHPStorm не получает ничего на порт 9999. Поэтому и ждёт бесконечно. Но тогда каким образом выполняется успешный коннект между PHPStorm и xdebug (если PHPStorm ничего не получает на порт 9999), о чём прямо написано в логах 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. После начала сессии отладки:
Log opened at 2017-07-07 19:14:10
I: Checking remote connect back address.
I: Remote address found, connecting to 10.0.2.2:9999.
I: Connected to client. :-)
-> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" fileuri="file:///home/user/www/site/index.php" language="PHP" protocol_version="1.0" appid="981" idekey="12155"><engine version="2.2.5"><![CDATA[Xdebug]]></engine><author><![CDATA[Derick Rethans]]></author><url><![CDATA[http://xdebug.org]]></url><copyright><![CDATA[Copyright (c) 2002-2014 by Derick Rethans]]></copyright></init>
<- feature_set -i 1 -n show_hidden -v 1
-> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" command="feature_set" transaction_id="1" feature="show_hidden" success="1"></response>
...
При завершении сессии отладки (жмём кнопку "Stop" в PHPStorm):
<- stop -i 19
-> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" command="stop" transaction_id="19" status="stopped" reason="ok"></response>
-> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" command="stop" transaction_id="19" status="stopping" reason="ok"></response>
<- run -i 20
Log closed at 2017-07-07 19:17:33
Как видно из логов, коннект между PHPStorm и xdebug состоялся успешно.
Но тогда почему PHPStorm не получает от xdebug (ждёт бесконечно) состояние в точках останова ?
Это можно объяснить тем, что после инициализации сессии отладки PHPStorm не получает ничего на порт 9999. Поэтому и ждёт бесконечно. Но тогда каким образом выполняется успешный коннект между PHPStorm и xdebug (если PHPStorm ничего не получает на порт 9999), о чём прямо написано в логах xdebug ? Парадокс...