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

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

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

  1. Браузер обращается к Apache
  2. Apache обращается к PHP
  3. PHP при появлении в коде breakpoint-а (каждый breakpoint это вызов функции xdebug_break(), который скрывает от нас IDE) обращается к xdebug
  4. xdebug создает подключение (открывает сокет) обращаясь к IDE Listener
  5. IDE Listener (запущенный на 9000 порту) открывает нам файл с breakpoint-ом и ожидает от нас действий (фактически PHP-интерпритатор ожидает выполнения функции xdebug_break())

Вот такие шаманства происходят на фоне, но на оф. сайте xdebug все описано значительно подробнее и не так ясно.

Кстати, если в настройках xdebug задан xdebug.idekey, то в следующих шагах логика дополняется:

1. браузер должен передать куку XDEBUG_SESSION и значением XDEBUG_ECLIPSE
4. xdebug проверяет XDEBUG_SESSION = XDEBUG_ECLIPSE

А теперь давайте по порядку, словно мы сомневаемся и хотим проверить описанные мной действия.

Оказывается, когда мы нажимаем на кнопку дебагинга в 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-а и завершится, при подключении. Удачи господа.

По мотивам: 1

Оцени публикацию:
  • 2,10
Оценили: 2


Предложения и пожелания:

 

youtube.com/watch?v=7hFivbgIEqk

При полном или частичном использовании материалов данного сайта, ссылка на сайт "yapro.ru" обязательна как на источник информации.
Автоматический импорт материалов и информации с сайта запрещен.
Copyrights © 2007 - 2019 YaPro.Ru

Лебеденко Николай Николаевич
Ошибка в тексте? Выделите её мышкой и нажмите: Ctrl + Enter