Почему я не могу отлаживать свой PHP-код в Docker с помощью VS Code с помощью Xdebug v3?

Я пытаюсь создать небольшую среду для тестирования отладки PHP в докере с кодом Visual Studio. Моя идея состоит в том, чтобы создать модель, которую я мог бы использовать для нескольких систем PHP, которые есть в нашей компании. Однако у меня не получилось отладить или использовать точки останова… Как будто VSCode отключен от Xdebug.

Это мой докерфайл

FROM php:7.4-apache

RUN apt-get update && apt upgrade -y
RUN docker-php-ext-install pdo mysqli pdo_mysql \
&& docker-php-ext-enable mysqli 
RUN pecl install xdebug-3.1.5 \
&& docker-php-ext-enable xdebug
ADD ./app /var/www/html
COPY ./app/test-form.conf /etc/apache2/sites-available/test-form.conf

# Copy php.ini
COPY ./php.ini /usr/local/etc/php

RUN echo 'SetEnv MYSQL_DB_CONNECTION ${MYSQL_DB_CONNECTION}' >> /etc/apache2/conf-enabled/environment.conf
RUN echo 'SetEnv MYSQL_DB_NAME ${MYSQL_DB_NAME}' >> /etc/apache2/conf-enabled/environment.conf
RUN echo 'SetEnv MYSQL_USER ${MYSQL_USER}' >> /etc/apache2/conf-enabled/environment.conf
RUN echo 'SetEnv MYSQL_PASSWORD ${MYSQL_PASSWORD}' >> /etc/apache2/conf-enabled/environment.conf
RUN echo 'SetEnv SITE_URL ${SITE_URL}' >> /etc/apache2/conf-enabled/environment.conf
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf &&\
    a2enmod rewrite &&\
    a2enmod headers &&\
    a2enmod rewrite &&\
    a2dissite 000-default &&\
    a2ensite test-form &&\
    service apache2 restart

Это мой docker-compose.yml

version: "1"
services:
  webserver:
    image: form-test
    ports:
      - "80:80"
      # - "443:443"
    volumes:
      - ./app:/var/www/html
    extra_hosts:
      - "host.docker.internal:host-gateway"
    environment:
      MYSQL_DB_CONNECTION: test
      MYSQL_DB_NAME: test
      MYSQL_USER: test
      MYSQL_PASSWORD: test
      SITE_URL: http://localhost
      XDEBUG_MODE: develop,debug
      XDEBUG_CONFIG:
        client_host=host.docker.internal
        start_with_request=yes
networks:
  internal:
    driver: bridge

Это мой xdebug_info.php

<?php

// xdebug_info();

phpinfo();

Это мой php.ini

[xdebug]
zend_extension=xdebug
xdebug.mode=develop,debug
xdebug.start_with_request=yes
xdebug.remote_port=9003
xdebug.client_port=9003
xdebug.remote_host=host.docker.internal

Это мой запуск.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen on Docker for Xdebug",
            "type": "php",
            "request": "launch",
            "port": 9003,
            "pathMappings": {
                "/var/www/html": "${workspaceFolder}"
            },
            "hostname": "0.0.0.0"
        },    
    ]
}

Вот это странно… кажется, что Xdebug успешно подключается к VSCode, потому что когда я запускаю свой xdebug_info.php, он показывает это сообщение:

Когда я начинаю слушать VSCode, сообщение исчезает:

Я также заметил, что синяя нижняя полоса в VS Code не становится оранжевой, как должна. После того, как я создал свою среду и не смог заставить ее работать.

Попробуйте добавить остановку при входе в launch.json. Вероятно, проблема с отображением путей. Каков путь сценария внутри и снаружи докера?

zobo 05.10.2023 16:22

Из первоначального вопроса: почему вы используете docker-compose версию 1?

Sachith Muhandiram 05.10.2023 16:22

Кроме того, в php.ini вы смешиваете настройки Xdebug2 и Xdebug3. Однако те, что в докере Env, вступают в силу, так что проблема не в этом. Также попробуйте добавить xdebug_break() в свой код.

zobo 05.10.2023 16:31

Вы открываете порт 443 из докера, но не 9003 (где прослушивает xdebug).

symcbean 05.10.2023 17:38

@symcbean «Вы открываете порт 443 из докера, но не 9003 (где прослушивает xdebug)» НЕПРАВИЛЬНО. Именно Xdebug подключается к клиенту отладки (в данном случае VSCode), а НЕ наоборот. Пожалуйста, сначала проверьте руководство.

LazyOne 05.10.2023 18:03

«Это странно… кажется, что Xdebug успешно подключается к VSCode, потому что, когда я запускаю свой xdebug_info.php, он показывает это сообщение:» Это означает, что VSCode еще НЕ прослушивает порт Xdebug или соединение чем-то заблокировано (например, брандмауэром) или используется неверный адрес/IP. Еще раз: именно Xdebug подключается к клиенту отладки, а не наоборот.

LazyOne 05.10.2023 18:14

«Когда я начинаю прослушивать VSCode, сообщение исчезает: «И теперь Xdebug смог подключиться (после того, как вы сказали VSCode начать листинг соединений). Попробуйте этот простой скрипт и посмотрите, как он будет работать: <?php $a = 1; $b = 3; $c = $a + $b; echo $c; Поместите каждую команду в отдельную строку, поставьте точку останова на $a = строке и попробуйте оттуда.

LazyOne 05.10.2023 18:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
7
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, Xdebug уже подключается к vscode и запускает сеанс отладки. Так что комментарий от zobo, вероятно, прав: это всего лишь проблема с отображением пути.

И действительно, в вашем docker-compose.yml вы привязываетесь к монтажу

    volumes:
      - ./app:/var/www/html

но в вашей конфигурации launch.json у вас есть

            "pathMappings": {
                "/var/www/html": "${workspaceFolder}"
            },

Итак, предполагая, что docker-compose.yml находится в корневой папке, которая также является папкой рабочей области для vscode, вам действительно нужно сопоставить

            "pathMappings": {
                "/var/www/html": "${workspaceFolder}/app"
            },

Вы человек! Это было совершенно правильно. Я добавил /app в сопоставление, и теперь оно работает как часы. Большое спасибо!

Rafael Rodrigues 09.10.2023 13:24

Другие вопросы по теме