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

CvR*_*eon 3 debugging xdebug docker magento2 visual-studio-code

这个问题是关于让 Xdebug 使用托管在 Web 服务器 Docker 实例中的 CLI PHP 脚本

我有docker 容器:web-server、、varnish-cachenginx-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 代码启动:

 "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
            }
        },
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

码头工人网络:

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": ""
            }
Run Code Online (Sandbox Code Playgroud)

CLI 命令:_as 可以看出,它是托管 Apache2 Web 服务器 Docker 容器中的bin/magento migrate:dataMagento 2命令。(上面显示的 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
Run Code Online (Sandbox Code Playgroud)

调试断点在 Windows 10 客户端 (IP 192.168.1.150) 上的 VS Code 中不起作用,因为我从容器内调用脚本172.100.0.2

日志文件/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) :-(
Run Code Online (Sandbox Code Playgroud)

因此,由于我不知道如何从 Windows 10 客户端且仅从 Docker 容器内运行 CLI 脚本,我该如何/做什么才能让此 CLI 脚本连接到 Xdebug?

附加信息(如果需要)

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

Der*_*ick 5

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

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

请记住:Xdebug 会连接到 IDE,而不是相反。

  • 我的编辑没有被接受,我想因为这是你的赏金,系统不允许我添加信息。这可能仅与 Magento 具体相关,但其他人可能会发现这对于故障排除很有用。您能否添加运行 `php bin/magento some:command` 和 _not_ `bin/magento some:command` 的事实,即使 `bin/magento` 是一个 PHP 脚本并且在不调试 CLI 时运行**很好**。如果没有在命令前面显式调用“php”,断点无法在带有 Docker 的 CLI 上工作到我的 IDE。 (2认同)