我想在这里提到一些关于xdebug.remote_host的内容。
xdebug.remote_host="127.0.0.1"
不是有效的。在某些情况下可能有效,但引号也可能会引起问题。大多数人在使用带引号的IP地址时没有问题,但这会树立一个不好的先例。这会让人们认为,如果要使用主机名或URL,就需要将其放在引号中。这是不正确的,带引号的URL将无法工作。
如果您想使用URL进行调试,只需在等号后面输入URL即可,如下所示:
xdebug.remote_host=subdomain.mydomain.com
我还想提一下,如果有端口号,请勿添加。以下方式无法正常工作:
xdebug.remote_host=subdomain.mydomain.com:9000
这就是你想要做的:
xdebug.remote_host=subdomain.mydomain.com
xdebug.remote_port=9000
如果你这样做,我也提醒你确保remote_connect_back已禁用。像这样:
xdebug.remote_connect_back=0
或者您可以完全省略它,像这样:
如果启用了remote_connect_back,它会尝试从传入连接中提取您的IP地址,并忽略remote_host和port设置。
Xdebug使用普通的TCP进行连接。这不是HTTP。这意味着像Fiddler这样的工具将不会显示任何调试数据或信息。如果您需要调试并查看服务器是否调用了您的IDE,则有几种方法可以检查。
Wireshark将允许您查看TCP流量。此外,如果您使用Windows,则Microsoft Message Analyzer也可以监视TCP。
但是,如果您只是想消除IDE可能导致的远程调试问题,我建议您启动本地TCP服务器。
这是一个很棒的免费Java程序,可用于启动TCP服务器:
http://sockettest.sourceforge.net/
![How to start a TCP Server](https://istack.dev59.com/fu0as.webp)
在IP地址部分,只需列出127.0.0.1或将其保留为0.0.0.0。然后列出端口号,通常默认为9000用于xdebug。
一旦TCP服务器运行,打开带有xdebug_break();函数调用的远程网页。这将告诉远程服务器上的xdebug在您的php.ini中列出的任何服务器和端口上开始调试。
观察套接字服务器并查看是否连接。发送的第一个数据应该类似于以下内容:
<init appid="APPID"
idekey="IDE_KEY"
session="DBGP_COOKIE"
thread="THREAD_ID"
parent="PARENT_APPID"
language="LANGUAGE_NAME"
protocol_version="1.0"
fileuri="file://path/to/file">
如果您已经到达这一步,远程调试正在运行!只需停止服务器并设置IDE以侦听该端口即可!
如果你和我们大多数人一样,你的开发机器是在一个带有NAT路由器后面的。这意味着你办公室中的每个人都拥有相同的公共IP地址。这是一个问题,因为当xdebug联系该IP地址开始调试时,它会命中路由器,而不是你的计算机。路由器可以配置以将某些端口号传递给单个计算机,但你可能不想这样做,因为该端口将保持打开状态,直到你将路由器设置更改回来。
另一个选择是使用SSH。这里有一个很好的示例:
http://stuporglue.org/setting-up-xdebug-with-netbeans-on-windows-with-a-remote-apache-server/#attachment_1305
我首选的选项是使用
Ngrok。Ngrok是一个用于重定向http、https和TCP流量的好工具。为了使用TCP重定向功能,你需要注册一个免费帐户。
一旦你注册了一个帐户,并将API密钥添加到你的计算机上,请在你的IDE所在的计算机上运行此命令:
ngrok tcp 9000
这将会打开一个TCP隧道(不是HTTP),从ngrok服务器到你运行命令的机器。我正在使用9000端口,如果你的IDE配置了不同的Xdebug端口,你可以更改此端口。
你应该看到以下内容:
![Ngrok tcp tunnel open](https://istack.dev59.com/HjcGF.webp)
您需要查看已打开的TCP隧道的URL。在此示例中,它是:
0.tcp.ngrok.io:14904
对于本次会话,您的服务器上的Xdebug设置应该是这样的:
xdebug.remote_host=0.tcp.ngrok.io
xdebug.remote_port=14904
URL和端口会在每次启动ngrok时更改。如果你想要相同的URL和端口,必须升级到付费账户。确保在修改php.ini后重新启动Apache。