在Docker容器中配置Xdebug



我正试图用PHP和Xdebug创建一个docker容器,以使用步骤调试。我使用VSCode,但不知怎么的,这个调试器不起作用。

显然,当我使用docker compose up -d命令时,Dockerfile没有被执行。我认为这是因为在文件中,它有一个COPY命令,用于将文件(称为90-xdebug.ini(从我的项目复制到特定目录。容器打开后,我检查目录,文件不在那里。。。那么我必须手动执行Dockerfile中的命令。

无论如何,在安装之后,我知道安装之所以有效,是因为xdebug_info()功能有效。但我不知道为什么VSCode不能调试它。

我的操作系统是Ubuntu 20.04.5 LTSDockerfiledocker-compose.yml90xdebug.ini都在项目的根目录中。

我的Dockerfile:

FROM php:7.4-apache
COPY 90-xdebug.ini "/usr/local/etc/php/conf.d"
RUN pecl install xdebug
RUN docker-php-ext-enable xdebug

90-xdebug.ini:

xdebug.mode=debug
xdebug.discover_client_host=0
xdebug.client_host=host.docker.internal

docker-compose.yml:

services:
php-apache:
container_name: php-apache
image: php:7.4-apache
build:
context: .
dockerfile: Dockerfile
extra_hosts:
- "host.docker.internal:host-gateway"
volumes:
- ./:/var/www/html/
working_dir: /var/www/html/
ports:
- 3003:3003
entrypoint: "php -S 0.0.0.0:3003"

launch.json内部";。vscode";目录:

{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Listen for Xdebug",
"type": "php",
"request": "launch",
"port": 9003
},
{
"name": "Launch currently open script",
"type": "php",
"request": "launch",
"program": "${file}",
"cwd": "${fileDirname}",
"port": 0,
"runtimeArgs": [
"-dxdebug.start_with_request=yes"
],
"env": {
"XDEBUG_MODE": "debug,develop",
"XDEBUG_CONFIG": "client_port=${port}"
}
},
{
"name": "Launch Built-in web server",
"type": "php",
"request": "launch",
"runtimeArgs": [
"-dxdebug.mode=debug",
"-dxdebug.start_with_request=yes",
"-S",
"localhost:0"
],
"program": "",
"cwd": "${workspaceRoot}",
"port": 9003,
"serverReadyAction": {
"pattern": "Development Server \(http://localhost:([0-9]+)\) started",
"uriFormat": "http://localhost:%s",
"action": "openExternally"
}
}
]
}

额外信息:这是我的程序,我在"$var=";txt1"线,但它直接朝着";xdebug_info((&";

<?php
function fprint(string $str):void{
echo $str;
}
$var = "txt1";
fprint($var);
$var = "txt2";
fprint($var);
$var = "txt3";
fprint($var);
// echo $PHP_INI_DIR;
// echo phpinfo();
xdebug_info();

正如您(在注释中(所说,xdebug_info()显示您有一个活动的调试连接,那么这意味着调试器可以工作。这里可能发生的情况是:

  1. 您没有设置任何断点-在这种情况下,调试器永远不会中断

  2. 更有可能的是,您确实设置了断点,但没有配置路径映射,该映射将容器内部的路径(/var/www/html(映射到您的本地项目路由,您可以使用"${workspaceRoot}/html"引用该路径。您需要通过进行以下配置来告诉VS Code此路径映射:

    "configurations": [
    {
    "name": "Listen for Xdebug",
    "type": "php",
    "request": "launch",
    "port": 9003,
    "pathMappings": {
    "/var/www/html": "${workspaceRoot}/html",
    }
    },
    

    在这种配置中,我可能没有得到完全正确的路径。如果你告诉Xdebug制作一个日志文件(-dxdebug.log=/tmp/xdebug.log-dxdebug.log_level=10(,它会在你的容器中创建一个记录文件,其中的内容告诉你尝试将哪个断点文件名与PHP看到的文件相匹配,比如:

    [11] [Step Debug] DEBUG: I:
    Matching breakpoint '/home/caio/dev/project/html/info.php:1'
    against location '/var/www/html/info.php:2'.
    

    如果这些路径不匹配,请调整路径映射。

相关内容

  • 没有找到相关文章

最新更新