xdebug под микроскопом

Автор: Aport Понедельник, Февраль 2nd, 2015 Нет комментариев

Рубрика: MySQL

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

Для начала опишу последовательность действий:

  1. Браузер с кукой XDEBUG_SESSION и значением XDEBUG_ECLIPSE обращается к:
  2. Apache, который обращается к:
  3. PHP, который при появлении в коде breakpoint-а (каждый breakpoint это вызов функции xdebug_break(), который скрывает от нас IDE) обращается к:
  4. xdebug, который проверяет XDEBUG_SESSION = XDEBUG_ECLIPSE и создает подключение (открывает сокет) обращаясь к:
  5. 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-а и завершится, при подключении. Удачи господа.

 

Источник: yapro.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты