使用VSCode和Docker编译PHP

ev7lccsx  于 2023-11-17  发布在  Docker
关注(0)|答案(7)|浏览(182)

我尝试使用VSCode调试一个在Docker上运行的PHP应用程序,但没有成功。
在过去,我可以很容易地调试我的PHP应用程序与VSCode运行WAMP服务器,但因为我开始与Docker工作,我无法得到调试工作。搜索了几个教程在线,检查了一些线程在这里的StackOverflow(例如:Docker and XDebug not reading breakpoints VSCode),但我仍然无法得到这个工作。
Dockerfile:

FROM php:7.1.8-apache

COPY /cms /srv/app/cms
COPY .docker/cms/vhosts/vhost.conf /etc/apache2/sites-available/cms.conf
COPY .docker/cms/vhosts/vhost-ssl.conf /etc/apache2/sites-available/cms-ssl.conf
COPY .docker/cms/vhosts/certificate.conf /etc/ssl/certs/certificate.conf
COPY .docker/cms/xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini

WORKDIR /srv/app/cms

RUN docker-php-ext-install mbstring pdo pdo_mysql
RUN pecl install xdebug 
RUN docker-php-ext-enable xdebug
RUN chown -R www-data:www-data /srv/app/cms
RUN openssl req -x509 -new -out /etc/ssl/certs/ssl-cert-cms.crt -config /etc/ssl/certs/certificate.conf
RUN a2ensite cms.conf
RUN a2ensite cms-ssl.conf
RUN a2enmod rewrite
RUN a2enmod ssl

字符串
xdebug.ini

[xdebug]
xdebug.default_enable=1
xdebug.remote_enable=1
xdebug.remote_port=9000
xdebug.remote_connect_back=0
xdebug.remote_host='host.docker.internal'
xdebug.idekey='VSCODE'
xdebug.remote_autostart=1


docker-compose.yml

version: '3.7'
services:
cms:
  build:
    context: .
    dockerfile: .docker/cms/Dockerfile
  image: php:7.1.8-apache
  ports:
    - 18080:80
    - 14430:443
  volumes:
    - ./cms:/srv/app/cms
  links:
    - mysql
    - redis
  environment:
    DB_HOST: mysql
    VIRTUAL_HOST: my.app.localhost
    PHP_EXTENSION_XDEBUG: 1


VSCode:launch.json

"configurations": [
    {
        "name": "Listen for XDebug",
        "type": "php",
        "request": "launch",
        "pathMappings": {
           "/srv/app/cms": "${workspaceRoot}/my.app/cms",
        },
        "port": 9000
    }, {
        "name": "Launch currently open script",
        "type": "php",
        "request": "launch",
        "program": "${file}",
        "cwd": "${fileDirname}",
        "port": 9000
    }
]


当我调试应用程序时,没有触发断点。我做错了什么?

**更新:**根据一些建议,我更新了我的docker-compose.yml和launch.json文件,但没有任何变化。

docker-compose.yml

ports:
  - 18080:80
  - 14430:443
  - 9000:9000 //added new xdebug default port


launch.json

"configurations": [
    {
        "name": "Listen for XDebug",
        "type": "php",
        "request": "launch",
        "pathMappings": {
           "/srv/app/cms": "${workspaceRoot}/my.app/cms",
        },
        "port": 9000,
        "log": true
    }
]


VSCode控制台:

<- launchResponse
Response {
seq: 0,
type: 'response',
request_seq: 2,
command: 'launch',
success: true }

**UPDATE #2:**从docker-compose.yml设置中删除了Xdebug端口(9000),下面是xdebug日志结果:

日志打开时间:2018-09-30 22:21:09 I:连接到配置的地址/端口:host.docker.internal:9000. E:连接到客户端超时(等待:200 ms):-(日志关闭时间:2018-09-30 22:21:09
日志打开时间:2018-09-30 22:21:17 I:连接到配置的地址/端口:host.docker.internal:9000. E:连接到客户端超时(等待:200 ms).:-(日志关闭时间:2018-09-30 22:21:17
日志打开时间:2018-09-30 22:21:18 I:连接到配置的地址/端口:host.docker.internal:9000. E:连接到客户端超时(等待:200 ms):-(日志关闭时间:2018-09-30 22:21:18
日志打开时间:2018-09-30 22:21:18 I:连接到配置的地址/端口:host.docker.internal:9000. E:连接到客户端超时(等待:200 ms):-(日志关闭时间:2018-09-30 22:21:18
还有什么建议吗

yhqotfr8

yhqotfr81#

通过以下设置解决了我的问题:

launch.json

{
    "version": "0.2.0",
    "configurations": [{
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9000,
            "log": true,
            "externalConsole": false,
            "pathMappings": {
                "/srv/app/cms": "${workspaceRoot}/cms",
            },
            "ignore": [
                "**/vendor/**/*.php"
            ]
        },
    ]
}

字符串

xdebug.ini

zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20160303/xdebug.so
xdebug.default_enable=1
xdebug.remote_enable=1
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
xdebug.remote_connect_back=0
xdebug.remote_host=host.docker.internal
xdebug.idekey=VSCODE
xdebug.remote_autostart=1
xdebug.remote_log=/usr/local/etc/php/xdebug.log

g6ll5ycj

g6ll5ycj2#

自xdebug版本3以来,配置名称发生了重大变化。
我当前的工作dockerfile:

RUN apt-get update; \
        apt-get -y --no-install-recommends install \
            php7.4-dev \
            php-pear \
            libcurl3-openssl-dev \
            libmcrypt-dev \
            libxml2-dev \
            libpng-dev \
        ; \
        pecl install xdebug; \
        { \
            echo "[xdebug]"; \
            echo "zend_extension=$(find /usr/lib/php/ -name xdebug.so)"; \
            echo "xdebug.mode=debug"; \
            echo "xdebug.start_with_request=yes"; \
            echo "xdebug.client_host=host.docker.internal"; \
            echo "xdebug.client_port=9001"; \
        } >> /etc/php/7.4/mods-available/xdebug.ini; \
        phpenmod -v 7.4 xdebug; \

字符串
VSC调试配置:

"configurations": [
        {
            "name": "XDebug (Docker)",
            "type": "php",
            "request": "launch",
            "port": 9001,
            "pathMappings": {
                "/var/www/app": "${workspaceRoot}",
            }
        }
    ]


更多信息:https://xdebug.org/docs/upgrade_guide

jexiocij

jexiocij3#

好吧,我已经尝试了所有以上的答案,花了几个小时,但没有成功,因为在所有以上的答案中,有些概念是不清楚的新x-debug用户就像我一样.我希望我会知道以下概念开始设置x-debugger之前,运行在docker容器或远程服务器上,与我的VS Code的PHP插件.我相信这将有助于寻找解决此类问题.

X-Cache设置

我不确定我的机器是否应该被视为客户端主机或服务器主机,虽然这是显而易见的,但当你花了几个小时进行配置时,简单的事情开始变得棘手。

xdebug.client_host

根据X-debug脚本:
此地址应该是the address of the machine where your IDE or debugging client is listening for传入调试连接。
我认为,与上面的文字不需要解释.因此,设置它如下在我们的x-debug配置即. xdebug.ini:

xdebug.client_host=host.docker.internal

字符串

xdebug.remote_host

这对我来说是一个有点棘手的配置。实际上,x-debug没有这样的配置,但我一直在思考它。:-)

PHP-SQL设置

主机名

我一直在使用不同的配置,除了这个(因为在这个线程中没有人提到这一点):-),没有成功。然后我重新探索了PHP的文档,并知道它必须设置为localhost在我的情况下,并给了它一个尝试,和繁荣!它的工作!

"hostname": "localhost"

端口

应该设置为与xdebug.client_port相同,默认值为9300。在上面的答案中重复提到。

pathMappings

这是另一个非常重要的配置,当尝试使用VS Code PHP插件设置Docker服务器时。它是一个对象,必须将您的本地目录结构Map到服务器/容器目录,即/home/user/proj/html:${workspaceRoot}。我不能进一步解释它,它确实为我工作,我在这里提到了它。如果有人解释它,我会很欢迎。
以下是我的最终设置:
x1c 0d1x的数据



希望这对你有帮助,并保存你的时间:-)

tkqqtvp1

tkqqtvp14#

您在docker-compose.yml中缺少端口:9000(或:9001),
它需要是可连接的,以便IDE从外部连接。
对于VSCode,PHP Debug扩展可能需要与xdebug交互。
默认的launch.json只使用port:9000一次-并且有log:true

{
  "configurations": [{
      "name": "Listen for XDebug",
      "type": "php",
      "request": "launch",
      "port": 9000,
      "log": true
    }, {
      "name": "Launch",
      "request": "launch",
      "type": "php",
      "program": "${file}",
      "cwd": "${workspaceRoot}",
      "externalConsole": false
    }
  ]
}

字符串
另请参阅vscode-php-debug和启动调试器。

kxkpmulp

kxkpmulp5#

对于在以下堆栈上运行的所有人:

  • Ubuntu
  • X射线衍射仪3
  • Laravel Sail
    docker/8.0/php.ini
[xdebug]
xdebug.discover_client_host=true
xdebug.start_with_request=yes

字符串

.env

SAIL_XDEBUG_MODE=develop,debug
# For linux only:
# you may read up about how to get the ip here: https://laravel.com/docs/8.x/sail#debugging-with-xdebug
SAIL_XDEBUG_CONFIG="client_host=172.22.0.1"

launch.json

{
"version": "0.2.0",
"configurations": [
    {
        "name": "Listen for XDebug via Docker",
        "type": "php",
        "request": "launch",
        "port": 9000,
        "log": true,
        "externalConsole": false,
        "pathMappings": {
            "/var/www/html": "${workspaceRoot}/www",
        },
        "ignore": [
            "**/vendor/**/*.php"
        ]
    },
] }

eimct9ow

eimct9ow6#

Symfony的XDEBUG v3示例
x1c 0d1x的数据

docker-compose.yml:

###> XDEBUG 3 ###
# Use your client IP here
# Linux: run "ip a | grep docker0"
# Windows (with WSL2): Run "grep nameserver /etc/resolv.conf  | cut -d ' ' -f2"
# MacOS: host.docker.internal
###< XDEBUG 3 ###
environment:
  XDEBUG_CLIENT_HOST: 172.17.0.1
  XDEBUG_CLIENT_PORT: 9003
  PHP_IDE_CONFIG: serverName=Docker
volumes:
  - ./xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini

字符串

xdebug.ini

xdebug.mode=debug,coverage
xdebug.start_with_request=yes
xdebug.client_host=${XDEBUG_CLIENT_HOST}
xdebug.client_port=${XDEBUG_CLIENT_PORT}

xdebug.ini for php:7.2-fpm-alpine3.8

zend_extension=xdebug.so

[xdebug]
xdebug.cli_color = 1
xdebug.mode = debug
xdebug.start_with_request = yes
xdebug.discover_client_host = 0
xdebug.client_host=host.docker.internal
xdebug.ideKey=docker


配置与代码修改路径Map示例

launch.json:

{

    "version": "0.2.0",
    "configurations": [{
        "name": "Listen for XDebug",
        "type": "php",
        "request": "launch",
        "port": 9003,
        "log": true,
        "externalConsole": false,
        "pathMappings": {
            "/appdata/www": "${workspaceRoot}/api",
        },
        "ignore": [
            "**/vendor/**/*.php"
        ]
    },
]
}

ua4mk5z4

ua4mk5z47#

VSCode中PHP的Xcode.exe,使用最低配置和默认设置

  • 检查PHP版本与XDEBUG的兼容性
  • 无需暴露docker-compose.ymlDockerfile中的任何端口
  • Dockerfile中安装并启用 * XPLAN *:
# Start of Dockerfile
 # You can use any image that includes PHP
 FROM prestashop/prestashop

 # Your customizations in the Dockerfile
 # ...

 # Install and enable XDebug
 RUN pecl install xdebug
 RUN docker-php-ext-enable xdebug

 # Enable XDebug in PHP configuration
 RUN echo '[XDebug] \n\ 
 zend_extension=xdebug.so \n\
 xdebug.mode=develop,debug \n\
 xdebug.client_host=host.docker.internal' >> /usr/local/etc/php/php.ini

字符串

  • 将应用程序根目录Map到主机上的绑定目录。在VSCode中:
  • 打开./.vscode/launch.json并找到您的调试配置文件,或创建一个
  • 添加pathMappings
  • 示例如下:
  • 一个PHP应用程序,在docker容器中的/var/www/html
  • 限制为home/user/Documents/myproject/public
  • 当你使用VScode时,你可以用${workspaceRoot}替换home/user/Documents/myproject
  • 所以最终的Map是:${workspaceRoot}/public
{
     "name": "Listen for Xdebug",
     "type": "php",
     "request": "launch",
     "port": 9003,
     "pathMappings": {
         "/var/www/html": "${workspaceRoot}/public",
     }
 }

相关问题