Я пытаюсь создать небольшую среду для тестирования отладки 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 не становится оранжевой, как должна. После того, как я создал свою среду и не смог заставить ее работать.
Из первоначального вопроса: почему вы используете docker-compose версию 1?
Кроме того, в php.ini вы смешиваете настройки Xdebug2 и Xdebug3. Однако те, что в докере Env, вступают в силу, так что проблема не в этом. Также попробуйте добавить xdebug_break() в свой код.
Вы открываете порт 443 из докера, но не 9003 (где прослушивает xdebug).
@symcbean «Вы открываете порт 443 из докера, но не 9003 (где прослушивает xdebug)» НЕПРАВИЛЬНО. Именно Xdebug подключается к клиенту отладки (в данном случае VSCode), а НЕ наоборот. Пожалуйста, сначала проверьте руководство.
«Это странно… кажется, что Xdebug успешно подключается к VSCode, потому что, когда я запускаю свой xdebug_info.php, он показывает это сообщение:» Это означает, что VSCode еще НЕ прослушивает порт Xdebug или соединение чем-то заблокировано (например, брандмауэром) или используется неверный адрес/IP. Еще раз: именно Xdebug подключается к клиенту отладки, а не наоборот.
«Когда я начинаю прослушивать VSCode, сообщение исчезает: «И теперь Xdebug смог подключиться (после того, как вы сказали VSCode начать листинг соединений). Попробуйте этот простой скрипт и посмотрите, как он будет работать: <?php $a = 1; $b = 3; $c = $a + $b; echo $c; Поместите каждую команду в отдельную строку, поставьте точку останова на $a = строке и попробуйте оттуда.






Кажется, 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 в сопоставление, и теперь оно работает как часы. Большое спасибо!
Попробуйте добавить остановку при входе в launch.json. Вероятно, проблема с отображением путей. Каков путь сценария внутри и снаружи докера?