繁体   English   中英

Xdebug Netbeans PHP Docker

[英]Xdebug Netbeans Php Docker

我通过http://dev.app/?XDEBUG_SESSION_START=netbeans-xdebug通过浏览器开始,我能得到的最好是页面保留,执行停止,但 Netbeans 不会在断点处停止,而是一直在等待连接。 那是我在 127.0.0.1:10000 上的 Netbeans 中设置代理的时候。

将 docker 机器 192.168.99.100 的 ip 放在那里更符合逻辑,但是页面刚刚加载,没有任何停止(win 8.1 上的 docker 工具包)。 此外,当我在 Netbeans 中省略代理时,一切都不会停止。

当某事正在侦听 10000 执行停止时我放置断点但 Netbeans 正在等待连接。 Xdebug 已安装并列在php -vphp -m 。我确实暴露了端口 10000。

调试器端口、项目 url 和会话 ID 在 Netbeans 中设置。

Xdebug文档说当您设置xdebug.remote_connect_back=1您不需要指定远程主机。

我从这里使用这个容器使用的 xdebug.ini

zend_extension=xdebug.so
xdebug.default_enable=1
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
; port 9000 is used by php-fpm
xdebug.remote_port=10000
xdebug.remote_autostart=0
; no need for remote host
xdebug.remote_connect_back=1
xdebug.idekey="netbeans-xdebug"

docker-compose.yml

php-fpm:
    build:
        context: ./php-fpm
        dockerfile: Dockerfile-70
    volumes_from:
        - application
    expose:
        - "9000"
        - "10000"
    ports:
        - "10000:10000"
    links:
        - workspace
    environment:
        PHP_IDE_CONFIG: "serverName=dev.app"

nginx:
    build: ./nginx
    volumes_from:
        - application
    volumes:
        - ./logs/nginx/:/var/log/nginx
    ports:
        - "80:80"
        - "443:443"
    links:
        - php-fpm

编辑:这是我在 Netbeans 中收听 192.168.99.1:10000 时的 xdebug.log,执行已暂停但 nb 仍在等待连接。 Win 防火墙已禁用。 我确实从 nb 停止了调试。

Log opened at 2016-05-26 09:38:04
I: Checking remote connect back address.
I: Checking header 'HTTP_X_FORWARDED_FOR'.
I: Checking header 'REMOTE_ADDR'.
I: Remote address found, connecting to 192.168.99.1:10000.
I: Connected to client. :-)
-> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/x
debug" fileuri="file:///var/www/laravel/public/index.php" language="PHP" xdebug:
language_version="7.0.6" protocol_version="1.0" appid="6" idekey="netbeans-xdebu
g"><engine version="2.4.0"><![CDATA[Xdebug]]></engine><author><![CDATA[Derick Re
thans]]></author><url><![CDATA[http://xdebug.org]]></url><copyright><![CDATA[Cop
yright (c) 2002-2016 by Derick Rethans]]></copyright></init>

-> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/db
gp/xdebug" status="stopping" reason="ok"></response>

Log closed at 2016-05-26 09:38:25

root@b42a5193d501:/tmp#

编辑2:

Xdebug 绑定在 vm 之外,php socket 确实连接了,这是关于 Netbeans 没有发送正确的数据。 Netbeans 中的路径映射

想法如何调试? 线鲨?

当调试开始并且 Netbeans 正在等待连接时,这是 netstat

C:\Windows\System32>netstat -np TCP | find "10000"
  TCP    192.168.99.1:10000     192.168.99.1:57084     ESTABLISHED
  TCP    192.168.99.1:10000     192.168.99.100:55650   ESTABLISHED
  TCP    192.168.99.1:57084     192.168.99.1:10000     ESTABLISHED

这是 vm 机器内的 netstat

docker@default:~$ sudo netstat -plnt | grep ':10000'
tcp        0      0 :::10000                :::*                    LISTEN

另外telnet ::1 10000连接,而telnet 192.168.99.1 10000telnet 192.168.99.100 10000没有,所以我想我找到了问题,docker vm 期望连接 :1 windows ip6 这很奇怪,因为我在整个过程中禁用了它?

我也在通过 Docker Compose 在容器内使用 Netbeans、php-fpm+nginx。 并让它发挥作用。 但我的主机操作系统是 linux (openSuse Tumbleweed)

我的脚步

1

在您的主机系统(运行 IDE 的地方)上,允许传入 TCP连接到 Netbeans 设置(黄色)中指定的端口。 在此处输入图片说明 想想防火墙、防病毒软件等。

2

确保 xdebug 安装在运行 php 的 Docker 容器中。 dockerfile 示例:

FROM php:7.3-fpm-alpine
RUN apk add --no-cache $PHPIZE_DEPS icu-dev \
    && docker-php-ext-install pdo_mysql intl \
    && pecl install xdebug-2.7.0RC2 \
    && docker-php-ext-enable xdebug \
    && touch /tmp/xdebub.log

确保指定版本的 xdebug 和 php 兼容 你可以执行php -i | grep xde php 容器内的php -i | grep xde以检查一切正常并且启用了 xdebug。

3

以某种方式在带有 php 的容器内提供 xdebug 配置。 您可以将echo添加到 dockerfile,或者在构建时将其从主机复制到容器。 我已经结束了这个:

xdebug.remote_enable=1
xdebug.remote_connect_back=1
xdebug.remote_port=9000
xdebug.profiler_enable=0
xdebug.remote_log="/tmp/xdebug.log"

在我的情况下,xdebug.idekey(图片上的红色高亮显示)由浏览器扩展通过 XDEBUG_SESSION cookie 传递。 直到我从 xdebug 的配置中删除remote_autostartdefault_enable ,它才起作用。

win 和 mac 用户注意事项

似乎xdebug.remote_connect_back=1不适用于您的系统。 您可能需要将其设置为 0 并添加xdebug.remote_host=host.docker.internal 链接: 关于 macos关于 windows

4

配置项目路径映射。 在此处输入图片说明

就这样

在配置时,我多次遇到 IDE 阻塞端口或类似问题。 在主机的终端它看起来像

> sudo lsof -i -P -n | grep 9000
java      28134 username  214u  IPv6 929551      0t0  TCP 172.20.10.1:9000->172.20.10.3:54104 (CLOSE_WAIT)

在这种情况下,IDE 重新启动会有所帮助。


在 OP 的示例中,无需从 php-fpm 容器或 9000 或 10000 公开任何端口。在 xdebug 会话中,php-fpm 进程连接到 IDE,因此 IDE 正在侦听端口,而不是 php-fpm。 另外这也不是php-fpm使用9000端口的问题,它在另一个接口上监听这个端口,不会和IDE冲突。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM