使用VSCode和Docker调试PHP

Ric*_*cky 18 php xdebug docker docker-compose visual-studio-code

我正在尝试使用VSCode调试在Docker上运行的PHP应用程序,但没有成功.

在过去,我能够使用运行WAMP Server的VSCode轻松调试我的PHP应用程序,但自从我开始使用Docker后,我无法进行调试工作.在线搜索了几个教程,在StackOverflow上检查了一些线程(例如:Docker和XDebug没有读取断点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
Run Code Online (Sandbox Code Playgroud)

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

泊坞窗,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
Run Code Online (Sandbox Code Playgroud)

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

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

更新: 基于一些建议我已经更新了我的docker-compose.yml和我的launch.json文件,但没有任何改变.

泊坞窗,compose.yml

ports:
  - 18080:80
  - 14430:443
  - 9000:9000 //added new xdebug default port
Run Code Online (Sandbox Code Playgroud)

launch.json

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

VSCode调试控制台:

<- launchResponse
Response {
seq: 0,
type: 'response',
request_seq: 2,
command: 'launch',
success: true }
Run Code Online (Sandbox Code Playgroud)

更新#2: 从docker-compose.yml设置中删除了Xdebug端口(9000).这是xdebug日志结果:

日志打开于2018-09-30 22:21:09 I:连接到已配置的地址/端口:host.docker.internal:9000.E:超时连接到客户端(等待:200毫秒).:-(日志关闭于2018-09-30 22:21:09

日志打开于2018-09-30 22:21:17 I:连接到已配置的地址/端口:host.docker.internal:9000.E:超时连接到客户端(等待:200毫秒).:-(日志关闭于2018-09-30 22:21:17

日志打开于2018-09-30 22:21:18 I:连接到已配置的地址/端口:host.docker.internal:9000.E:超时连接到客户端(等待:200毫秒).:-(日志关闭于2018-09-30 22:21:18

日志打开于2018-09-30 22:21:18 I:连接到已配置的地址/端口:host.docker.internal:9000.E:超时连接到客户端(等待:200毫秒).:-(日志关闭于2018-09-30 22:21:18

还有什么建议吗?

更新#3:使用以下设置解决了我的问题:

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

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

Ric*_*cky 9

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

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

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

  • 是的,没有必要在 docker 中暴露端口 9000。 (4认同)
  • 我有好几天都遇到同样的问题......我最终 **NOT** 从我自己的 docker-compose 文件中暴露了端口 9000,xDebug 开始工作了!太感谢了! (2认同)

Get*_*toX 5

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

VSC 调试配置:

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

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