Php 远程服务器上Docker内部的Xdebug远程调试

Php 远程服务器上Docker内部的Xdebug远程调试,php,docker,server,xdebug,ssh-tunnel,Php,Docker,Server,Xdebug,Ssh Tunnel,我需要调试远程服务器上Docker容器中的PHP脚本 通常,我在Windows中使用Visual Studio代码调试代码。我一直在以这种方式调试我的开发代码(它位于一个流浪汉中),没有任何问题 但当涉及到调试远程服务器上Docker中的文件时,我无法让它工作 下面是我在php.ini上的xdebug设置(位于远程服务器上的docker中) 上述设置中的远程\u主机IP地址是从Docker内部看到的远程主机的IP 我尝试了ssh隧道到我的远程服务器(从Windows,使用telnet) 但是,当

我需要调试远程服务器上Docker容器中的PHP脚本

通常,我在Windows中使用Visual Studio代码调试代码。我一直在以这种方式调试我的开发代码(它位于一个流浪汉中),没有任何问题

但当涉及到调试远程服务器上Docker中的文件时,我无法让它工作

下面是我在php.ini上的xdebug设置(位于远程服务器上的docker中)

上述设置中的
远程\u主机
IP地址是从Docker内部看到的远程主机的IP

我尝试了ssh隧道到我的远程服务器(从Windows,使用telnet)

但是,当我尝试在浏览器上运行该站点时,我的Visual Studio代码无法检测到调试会话

基本上我所做的是:

  • 在本地计算机(Windows)上启动调试会话
  • 使用
    ssh-R 9000:localhost:9000创建到远程服务器的ssh隧道(将服务器上的端口9000转发到localhost:9000)username@myremoteserver.com
  • 将Docker上的端口9000映射到远程服务器上的端口9000
  • docker中的Xdebug被设置为侦听其主机(因此从docker内部查看主机的IP地址,这是我从docker内部运行此命令得到的:
    /sbin/IP route | awk'/default/{print$3}'
  • 运行站点时,
    /tmp/debug.log
    包含以下内容:

    I: Connecting to configured address/port: 172.18.0.1:9000.
    I: Connected to client. :-)
    -> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" fileuri="file:///magento/test.php" language="PHP" xdebug:language_version="5.6.33-1+ubuntu16.04.1+deb.sury.org+1" protocol_version="1.0" appid="12776" idekey="www-data"><engine version="2.5.5"><![CDATA[Xdebug]]></engine><author><![CDATA[Derick Rethans]]></author><url><![CDATA[http://xdebug.org]]></url><copyright><![CDATA[Copyright (c) 2002-2017 by Derick Rethans]]></copyright></init>
    
    -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" status="stopping" reason="ok"></response>
    
    I:连接到配置的地址/端口:172.18.0.1:9000。
    I:已连接到客户端。:-)
    -> 
    -> 
    

    如何将Xdebug设置的连接从Docker“中继”到远程服务器,再到本地pc上的IDE?

    我无法通过ssh隧道实现同样的功能:(

    但这是可能的。你应该:

  • 在本地开发机器上安装
    ngrok
  • 运行ngrok tcp 9000
  • 根据ngrok的信息设置
    xdebug.remote\u端口
    xdebug.remote\u主机

  • 不要使用标准的9000端口——最好选择9001或其他端口。现在,一些知道Xdebug是什么以及它是如何工作的服务正在响应Xdebug连接(根据您的日志),并简单地告诉Xdebug“走开”(通过说“在没有调试的情况下运行到最后”)。如果您使用了错误的IP地址,很可能是php fpm。另外,不知道
    172.18.0.1
    来自何方——对于SSH隧道,您应该真正使用
    127.0.0.1
    .1)“docker中的Xdebug设置为侦听其主机”什么?RTM谢谢。Xdebug什么都不听。只是因为是Xdebug连接到IDE,而不是其他方式。。。2) IP地址必须是运行IDE/编辑器的PC的地址(如果您愿意并可以直接连接)。否则您需要SSH隧道。。。然后,您需要使用127.0.0.1,以便将连接从远程系统转发到您的开发人员PC。3)现在,您必须只连接到本地(远程)php fpm或一些类似的服务,这些服务支持Xdebug(知道它是如何工作的)。。正如它清楚地告诉Xdebug“走开”一样。1)RTM:2)它是针对PhpStorm的。。但也适用于VSCode(因为基础对于任何IDE/编辑器都是一样的):可能的重复
    I: Connecting to configured address/port: 172.18.0.1:9000.
    I: Connected to client. :-)
    -> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" fileuri="file:///magento/test.php" language="PHP" xdebug:language_version="5.6.33-1+ubuntu16.04.1+deb.sury.org+1" protocol_version="1.0" appid="12776" idekey="www-data"><engine version="2.5.5"><![CDATA[Xdebug]]></engine><author><![CDATA[Derick Rethans]]></author><url><![CDATA[http://xdebug.org]]></url><copyright><![CDATA[Copyright (c) 2002-2017 by Derick Rethans]]></copyright></init>
    
    -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" status="stopping" reason="ok"></response>