web-dev-qa-db-fra.com

Déboguer PHP avec VSCode et Docker

J'essaie de déboguer une application PHP s'exécutant sur Docker avec VSCode, mais sans succès.

Dans le passé, j’étais capable de déboguer facilement mes applications PHP avec VSCode exécutant WAMP Server, mais depuis que je travaille avec Docker, je ne parviens pas à faire fonctionner le débogage. J'ai cherché plusieurs tutoriels en ligne, vérifié quelques discussions ici sur StackOverflow (ex .: Docker et XDebug ne lisant pas les points d'arrêt VSCode ), mais je ne parviens toujours pas à obtenir ce fonctionnement.

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
    }
]

Lorsque je débogue l'application, aucun point d'arrêt n'est déclenché. Qu'est-ce que je fais mal?

UPDATE: Sur la base de certaines suggestions, j'ai mis à jour mon fichier docker-compose.yml et mes fichiers launch.json, mais rien n'a changé.

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
    }
]

Console de débogage VSCode:

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

UPDATE # 2: Suppression du port Xdebug (9000) des paramètres docker-compose.yml. Voici le résultat du journal xdebug:

Journal ouvert à 2018-09-30 22:21:09 I: Connexion à configuré adresse/port: Host.docker.internal: 9000. E: Time-out connexion à client (attendu: 200 ms). :-( Ouverture du journal au 2018-09-30 22:21:09

Journal ouvert à 2018-09-30 22:21:17 I: Connexion à configuré adresse/port: Host.docker.internal: 9000. E: Time-out connexion à client (attendu: 200 ms). :-( Ouverture du journal au 2018-09-30 22:21:17

Journal ouvert à 2018-09-30 22:21:18 I: Connexion à configuré adresse/port: Host.docker.internal: 9000. E: Time-out connexion à client (attendu: 200 ms). :-( Ouverture du journal au 2018-09-30 22:21:18

Journal ouvert à 2018-09-30 22:21:18 I: Connexion à configuré adresse/port: Host.docker.internal: 9000. E: Time-out connexion à client (attendu: 200 ms). :-( Ouverture du journal au 2018-09-30 22:21:18

Des suggestions supplémentaires?

UPDATE # 3: résolution du problème en utilisant les paramètres suivants:

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
6
Ricky

J'ai réussi à résoudre mon problème avec les paramètres suivants:

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
1
Ricky

le port :9000 (ou :9001) est manquant dans le docker-compose.yml,

qui doit être connectable, pour que le IDE se connecte de l’extérieur.

pour VSCode, l’extension PHP Debug peut être nécessaire pour interagir avec xdebug.

la valeur par défaut launch.json utilise uniquement port:9000 une seule fois - et a 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
    }
  ]
}

voir aussi vscode-php-debug et démarrer le débogueur .

1
Martin Zeitler