Преамбула
Как и многие другие, я потратил больше времени на отладку подключения к IDEs в XDebug, чем с помощью XDebug для отладки моих программ. Ive заставил его работать повторно, но время от времени я получаю общую проблему "Ожидание подключения" . Я не смог локализовать то, что заставляет XDebug работать или терпеть неудачу. Ive использовал ubuntu в течение двух лет; Я не ни ноб, ни гуру-страт. Что я делаю неправильно? Как лучше отладить подключение IDE к XDebug?
Настройка
- Ubuntu 10.10
- Netbeans 6.9.1
- PHP 5.3.3-1ubuntu9 с Suhosin-Patch
- Xdebug v2.1.0 с debugclient, созданным 20 сентября 2010 г. из источника, с помощью индивидуальных инструкций по установке script на xdebug.org
- Apache Apache/2.2.16
- Оба /etc/php 5/apache2/php.ini и/etc/php5/cli/php.ini имеют:
-
zend_extension = /usr/lib/php5/20090626+lfs/xdebug.so xdebug.remote_enable=1 xdebug.remote_handler=dbgp xdebug.remote_mode=req xdebug.remote_host=127.0.0.1 xdebug.remote_port=9000 xdebug.remote_log=/var/log/xdebug.log xdebug.extended_info=1 xdebug.idekey="netbeans-xdebug"
-
Процедура
Проблема
Я не могу объяснить, что вызывает проблему или когда проблема проявляется. Он начинается, когда я пытаюсь отладить мой проект, что заставляет браузер моего браузера (Chrome) открывать URL-адрес моего проекта с параметром XDEBUG_SESSION_START=netbeans-xdebug
. Это приводит к тому, что страница обычно отображается в хроме, а Netbeans сообщает только "Ожидание подключения".
Отладка XDebug
Во-первых, когда сообщение "Ожидание подключиться" все еще живое, я пытаюсь использовать netstat для копирования вокруг порта 9000, который идет что-то вроде:
$ netstat -an | grep 9000
tcp6 0 0 :::9000 :::* LISTEN
Я закрыл свою IDE и попытался использовать два файла, чтобы выяснить, что происходит: {webroot}/index.php
содержит <?php phpinfo(); ?>
, а {webroot}/dbgtest.php
содержит Проверка установки XDebug script:
<?php
$address = '127.0.0.1';
$port = 9000;
$sock = socket_create(AF_INET, SOCK_STREAM, 0);
socket_bind($sock, $address, $port) or die('Unable to bind');
socket_listen($sock);
$client = socket_accept($sock);
echo "connection established: $client";
socket_close($client);
socket_close($sock);
?>
Когда я запускаю XDebug debugclient
и открываю http://127.0.0.1/dbgtest.php?XDEBUG_SESSION_START=mysession
, я обычно получаю регулярный вывод , а затем проверяет, что XDebug подключен к script с netstat в другом терминале:
$ netstat -an | grep 9000
tcp 0 0 127.0.0.1:9000 127.0.0.1:34831 ESTABLISHED
tcp 0 0 127.0.0.1:34831 127.0.0.1:9000 ESTABLISHED
Хотя оба они указывают на то, что соединение было сделано, веб-страница читает "Невозможно связать", что я не могу объяснить. Я Ctrl-c, чтобы закрыть debugclient, и netstat в этот момент проверяет, что порт 9000 не имеет активности. Я запускаю Netbeans, откройте {webroot}/index.php
и включите отладчик, который открывает http://127.0.0.1/index.php
. Отладчик тогда обычно запускается нормально. Я останавливаю отладчик, вернусь к моему проекту, и именно здесь проблема действительно становится раздражающей: иногда я могу продолжить отладку своего проекта как обычно, а в других случаях проблема снова возникает, а в то время как "Ожидание Connect", показывает netstat:
$ netstat -an | grep 9000
tcp6 0 0 :::9000 :::* LISTEN
tcp6 0 0 127.0.0.1:9000 127.0.0.1:34681 TIME_WAIT
В другое время я перезагружаю компьютер, запускаю терминал и нахожу:
$ netstat -an | grep 9000
unix 3 [ ] STREAM CONNECTED 9000
$ telnet 127.0.0.1 9000
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused
Я не достаточно знаком с сетевыми и внутренними интерфейсами Linux, чтобы понять, на что это указывает. Ясно, что что-то использует порт 9000. Что это значит? Обратите внимание, что несмотря на мои настройки в php.ini:
$ cat /var/log/xdebug.log
cat: /var/log/xdebug.log: No such file or directory