Docker - Xdebug调试PHP CLI脚本(VS Code)

3
这个问题是关于如何在一个运行在 Web 服务器 Docker 实例中的 CLI PHP 脚本中使用 Xdebug 的。 我有以下 Docker 容器:web-server、varnish-cache 和 nginx-proxy。 使用以下 VS Code 启动配置,我能够成功地通过浏览器调试 Magento 2 的网页:
这是使用新的 XDebug v3 它删除了许多 v2 配置设置。
客户端 (Windows 10) IP(我的笔记本电脑): 192.168.1.150,主机 (Ubuntu 20.04) IP: 192.168.1.105,托管在 Docker 容器 IP 上:172.100.0.2-5 VS Code Launch:
 "name": "(Magento 2) Listen for XDebug on 192.168.1.5/105",
            "type": "php",
            "request": "launch",
            "port": 9099,
            "stopOnEntry": false, // Set to true to test any script on entry
            "log": false,
            // Remember to update remote_connect_back or remote_host
            // inside xdebug PHP configuration.
            // When using CLI debugging - rather use remote_host,
            // because remote_connect_back = 1 does not work with CLI
            // Server -> Local
            "pathMappings": {
                "/var/www/html/": "${workspaceRoot}",
            },
            "xdebugSettings": {
                "max_children": 10000,
                "max_data": 10000,
                "show_hidden": 1
            }
        },

XDebug配置(PHP 7.3)

zend_extension=xdebug.so
xdebug.log=/var/log/apache2/xdebug.log
xdebug.idekey=VSCODE
xdebug.client_port=9099
xdebug.client_discovery_header=HTTP_X_REAL_IP
xdebug.discover_client_host=On
; fallback for CLI - use client_host
xdebug.client_host=172.100.0.2
xdebug.start_with_request=yes
xdebug.mode=debug

Docker网络:

docker inspect network magento2-network-frontend:
        "Containers": {
            "6538a93fbe811fbbd9646d4ce089e1b686b508862ed86f6afaac1b600043a1e5": {
                "Name": "redis-cache-magento2.3.5",
                "EndpointID": "d27bfbff61765cf2b840e98d43ec7a378e182baa7007dabde4bab5a41734fa2a",
                "MacAddress": "02:42:ac:64:00:05",
                "IPv4Address": "172.100.0.5/16",
                "IPv6Address": ""
            },
            "7c7ba745db17d6d6a100901ed1e3fe38a3d26a97e086edc155254a7d41033bcf": {
                "Name": "web-server-apache2-magento2-3-5",
                "EndpointID": "9b81f6b7ff2292eba6fb68af209f1d5c958bea3ee0d505512862f225ed8e57be",
                "MacAddress": "02:42:ac:64:00:02",
                "IPv4Address": "172.100.0.2/16",
                "IPv6Address": ""
            },
            "7f208ecce2aafdf182e4616ef2e8b043f3b8245018c299aae06c1acf4fc0d029": {
                "Name": "varnish-cache-magento2-3-5",
                "EndpointID": "e1c4e3f9e792b7dfd2cebfbb906bd237795820639a80ab8f530f0c8418257611",
                "MacAddress": "02:42:ac:64:00:03",
                "IPv4Address": "172.100.0.3/16",
                "IPv6Address": ""
            },
            "dc599fa93b09650b70f8f95333caecc8f9db18cd19b17be57d84196e91f54c2a": {
                "Name": "nginx-proxy-magento2-3-5",
                "EndpointID": "7b8396af676d9af51b098d09f20d9e73ef83f4b085cb5f7195ea234aae7ed91d",
                "MacAddress": "02:42:ac:64:00:04",
                "IPv4Address": "172.100.0.4/16",
                "IPv6Address": ""
            }

CLI命令:_可以看到这是一个Magento 2 bin/magento migrate:data 命令,来自于托管Apache2 Web服务器的Docker容器内部。 (上面显示的IP为:172.100.0.2
rm var/migration* && bin/magento migrate:data /var/www/html/app/code/ModuleOverrides/Magento_DataMigrationTool/etc/opensource-to-opensource/1.7.0.2/config.localboth.host_restoredb.xml

在我的Windows 10客户端(IP 192.168.1.150)中,由于我从容器(172.100.0.2)内部调用脚本,因此我的VS Code中没有任何调试断点可用。
日志文件/var/log/apache2/xdebug.log证实了类似的情况。
Could not connect to debugging client. Tried: 172.100.0.2:9099 (fallback through xdebug.client_host/xdebug.client_port) :-(

因为我不知道如何在 Windows 10 客户端上运行 CLI 脚本,只能在 Docker 容器内运行,所以我该如何让这个 CLI 脚本连接到 Xdebug?

额外信息(如有需要)

Magento 2 有 CLI 功能bin/magento [command]——我尝试调试的命令是 data-migration-tool 的一部分,它无法正确导入属性。 在 github 上没有人对这个特定问题有一个 100% 可行的解决方案——所以我想深入挖掘,找到一个解决方案。此外,该工具只是一个 CLI 工具,没有 web-ui 选项


请告诉我是否需要其他信息。我真的很想解决这个问题,因为将来我还需要调试CLI脚本。 - CvRChameleon
我从未想过这是一个如此不可能的请求,成千上万的PHP开发人员,却没有人能回答如何在Docker中使用xdebug来调试CLI脚本。拜托了各位 :) 这里有没有人可以帮忙! - CvRChameleon
1个回答

5

您需要将Xdebug的xdebug.client_host设置为您IDE的IP地址,即192.168.1.150

您还需要关闭xdebug.discover_client_host,因为那会尝试使用内部Docker网络的IP地址(172.100.0.2),而这不是您的IDE正在侦听的地方。

请记住:Xdebug建立到IDE的连接,而不是相反地。


我刚刚发现我一直在关注错误的地方... 我没有意识到xdebug会将来自 172.100.0.2:9099 的连接(这是xdebug继续抱怨无法“连接到”的docker连接...)转发到我的IDE 192.168.1.150:9099。这对他人来说是很重要的信息。Xdebug的错误输出让我感到困惑,我以为应该让xdebug连接172.100.0.2:9099,但结果证明了你的解决方案是正确的。如果可以,我会为你的答案添加额外的信息,以帮助其他人。 - CvRChameleon
我在回答中添加了额外的重要信息(还有其他需要考虑的事情),与您的附加答案一起。 - CvRChameleon
是的,来自xdebug日志文件的错误信息让我误以为情况完全相反。只有通过确保了解您的答案为什么会奏效,我才意识到这一点......再次感谢! - CvRChameleon
2
我的编辑未被接受,我猜是因为这是你的悬赏,系统不允许我添加信息。这可能只与Magento有关,但其他人在故障排除时可能会发现这很有用。 请注意添加运行php bin/magento some:command而不是bin/magento some:command的事实,即使bin/magento是一个PHP脚本,在不调试CLI时也可以正常运行。在使用Docker连接IDE时,CLI上的断点没有起作用,除非在命令前显式调用php - CvRChameleon
我认为这是Magento特有的事情?可能它会在没有ini文件或类似的东西的情况下启动PHP?这确实不是Xdebug关心的事情。 - Derick
是的,这就是问题所在:我不确定;但在我的实例中,Xdebug在Magento中无法调试任何内容。这一定与此有关。无论如何,这非常令人困惑(要进行故障排除和使其正常工作)并且很奇怪。感谢您的建议。 - CvRChameleon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接