Предлагаю проверить работу xdebug без участия IDE Т.е. предлагаю разобраться, что же происходит когда мы установили xdebug и нажали кнопочку дебагинга в IDE.
Для начала опишу последовательность действий:
Браузер с кукой XDEBUG_SESSION и значением XDEBUG_ECLIPSE обращается к:
Apache, который обращается к:
PHP, который при появлении в коде breakpoint-а (каждый breakpoint это вызов функции xdebug_break(), который скрывает от нас IDE) обращается к:
xdebug, который проверяет XDEBUG_SESSION = XDEBUG_ECLIPSE и создает подключение (открывает сокет) обращаясь к:
IDE Listener (запущенный на 9000 порту) которая открывает нам файл с breakpoint-ом и ожидает от нас действий (фактически PHP-интерпритатор ожидает выполнения функции xdebug_break())
Вот такие шаманства происходят на фоне, но на оф. сайте xdebug все описано значительно подробнее и не так ясно.
А теперь давайте по порядку, словно мы сомневаемся и хотим проверить описанные мной действия.
Оказывается, когда мы нажимаем на кнопку дебагинга в IDE, то в фоне запускается процесс-слушатель, который ждет, что к нему подключится xdebug. Давайте проверим это.
1. Напишем скрипт-слушатель, который будет как IDE слушать 9000 порт в надежде, что к нему обратиться xdebug
<?php
// файл listener.php
$sock = socket_create(AF_INET, SOCK_STREAM, 0);
socket_bind($sock, ’127.0.0.1′, 9000) or die(‘Unable to bind’);
socket_listen($sock);
$client = socket_accept($sock);
sleep(10);// задержка, чтобы во время подключения, в паралельной консоле посмотреть, кто подключился к нашему слушателю, делается это командой netstat -nta | grep 9000
echo «connection established: $client»;// при подключении дебагера должен выдать Resource id #5
socket_close($client);
socket_close($sock);
2. Запускаем слушателя:
# php listener.php
2. Если сейчас в паралельном окне консоли выполнить: netstat -nta | grep 9000 то ответ будет таким:
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN
3. Проверим, произойдет ли что-то с слушаетелем, если к нему подключиться следующим скриптом:
<?php
// файл xdebug.php, которым подключаемся к слушателю
$socket = fsockopen(’127.0.0.1′, 9000);
sleep(10);
fwrite($socket, ‘proxyinit -p 9000 -k PHPSTORM’); // 9000 = phpStorm standard debug-port.
fclose($socket);
echo ‘done’;
4. Запускаем xdebug.php:
# php xdebug.php
и видим, что запущенный в шаге 2 слушатель, у нас закончил свою работу
# php listener.php
connection established: Resource id #5
Такими образом, если мы сомневаемся в работе xdebug, то мы всегда можем воспользоваться скриптом listener.php который будет ждать подключения к нему xdebug-а и завершится, при подключении. Удачи господа.