Docker + Xdebug + VSCode Не удалось подключиться к клиенту - PullRequest
6 голосов
/ 12 мая 2019

версия PHP: 7.1.20

Версия XDebug: 2.7.0

Я использую Docker-контейнер на MacOS Mojave. При нажатии «F5» отображаются параметры отладки «Пауза», «Перезагрузка» и «Стоп» Но шаг за шагом, шаг за шагом, шаг за шагом отключены.

Я немного учусь, потому что до 2012-13 гг. Я работал с кодом на ОС Windows. После этого года я вернулся к кодированию в этом месяце. :) Даже после просмотра большого количества постов в Google о том, как решить эту проблему, я не уверен, как, наконец, заставить его работать. Пожалуйста, помогите.

Мой launch.json файл:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9001,
            "log": true,
            "pathMappings": {
                "/var/www/html": "${workspaceFolder}/learn"
            }
        },
        {
            "name": "Launch currently open script",
            "type": "php",
            "request": "launch",
            "program": "${file}",
            "cwd": "${fileDirname}",
            "port": 9001
        }
    ]
}

XDebug php.ini config:

xdebug.remote_host = 172.20.0.1
xdebug.remote_port = 9001
xdebug.scream = 1
xdebug.remote_enable = 1
xdebug.show_local_vars = 1
xdebug.remote_autostart = 1
xdebug.remote_connect_back = 1
xdebug.remote_log = "/var/www/html/xdebug.log"
xdebug.idekey = "VSCODE"

Файл журнала XDebug (из настройки xdebug.remote_log в php.ini):

[12] Log opened at 2019-05-12 10:16:44
[12] I: Checking remote connect back address.
[12] I: Checking header 'HTTP_X_FORWARDED_FOR'.
[12] I: Checking header 'REMOTE_ADDR'.
[12] I: Remote address found, connecting to 172.20.0.1:9001.
[12] W: Creating socket for '172.20.0.1:9001', poll success, but error: Operation now in progress (29).
[12] E: Could not connect to client. :-(
[12] Log closed at 2019-05-12 10:16:44

Консоль отладки:

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

Вот dockerfile.

FROM php:7.1.20-apache

RUN apt-get -y update --fix-missing
RUN apt-get upgrade -y

# Install tools & libraries
RUN apt-get -y install apt-utils nano wget dialog \
    build-essential git curl libcurl3 libcurl3-dev zip

# Install important libraries
RUN apt-get -y install --fix-missing apt-utils build-essential git curl libcurl3 libcurl3-dev zip \
    libmcrypt-dev libsqlite3-dev libsqlite3-0 mysql-client zlib1g-dev \
    libicu-dev libfreetype6-dev libjpeg62-turbo-dev libpng-dev

# Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# PHP Extensions
RUN pecl install xdebug-2.7.0 \
    && docker-php-ext-enable xdebug \
    && docker-php-ext-install mcrypt \
    && docker-php-ext-install pdo_mysql \
    && docker-php-ext-install pdo_sqlite \
    && docker-php-ext-install mysqli \
    && docker-php-ext-install curl \
    && docker-php-ext-install tokenizer \
    && docker-php-ext-install json \
    && docker-php-ext-install zip \
    && docker-php-ext-install -j$(nproc) intl \
    && docker-php-ext-install mbstring \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd \
    && pecl install redis \
    && docker-php-ext-enable redis

# Enable apache modules
RUN a2enmod rewrite headers

ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

Вот файл docker-compose.yml.

version: "3"

services:
  webserver:
    build: 
      context: ./bin/webserver
    container_name: '7.1.x-webserver'
    restart: 'always'
    ports:
      - "80:80"
      - "443:443"
    links: 
      - mysql
    volumes: 
      - ${DOCUMENT_ROOT-./www}:/var/www/html
      - ${PHP_INI-./config/php/php.ini}:/usr/local/etc/php/php.ini
      - ${VHOSTS_DIR-./config/vhosts}:/etc/apache2/sites-enabled
      - ${LOG_DIR-./logs/apache2}:/var/log/apache2
  mysql:
    build: ./bin/mysql
    container_name: '5.7-mysql'
    restart: 'always'
    ports:
      - "3306:3306"
    volumes: 
      - ${MYSQL_DATA_DIR-./data/mysql}:/var/lib/mysql
      - ${MYSQL_LOG_DIR-./logs/mysql}:/var/log/mysql
    environment:
      MYSQL_ROOT_PASSWORD: tiger
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: 'sc-phpmyadmin'
    links:
      - mysql
    environment:
      PMA_HOST: mysql
      PMA_PORT: 3306
    ports:
      - '8080:80'
    volumes: 
      - /sessions
  redis:
    container_name: 'sc-redis'
    image: redis:latest
    ports:
      - "6379:6379"

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 31 мая 2019

Попробуйте открыть порт 9001 в docker-compose.yml, вставив:

ports:
 - "9001:9001"

Пример

services:
  webserver:
    build: 
      context: ./bin/webserver
    container_name: '7.1.x-webserver'
    restart: 'always'
    ports:
      - "80:80"
      - "443:443"
      - "9001:9001"
    links: 
      - mysql
    volumes: 
      - ${DOCUMENT_ROOT-./www}:/var/www/html
      - ${PHP_INI-./config/php/php.ini}:/usr/local/etc/php/php.ini
      - ${VHOSTS_DIR-./config/vhosts}:/etc/apache2/sites-enabled
      - ${LOG_DIR-./logs/apache2}:/var/log/apache2

Подробнее о настройке docker-compose.yml: https://docs.docker.com/compose/compose-file/

Возможно, вы сможете использовать expose. У нас это есть в некоторых наших старых файлах Docker, предназначенных для разрешения подключений xDebug, но я не использовал его лично.

    expose:
      - "9001"
1 голос
/ 01 июня 2019

Контейнер Docker может быть подключен к вашему хосту путем соответствующей настройки PHP.

Обратите внимание, что я использовал домен Docker host.docker.internal, который всегда указывает на IP-адрес хоста.

xdebug.remote_enable=1
xdebug.remote_port=9000
xdebug.idekey=docker
xdebug.profiler_enable=0
xdebug.profiler_enable_trigger=1
xdebug.remote_host=host.docker.internal

Нет необходимости открывать порты для контейнера докера.Просто убедитесь, что ваше приложение отладки может прослушивать назначенный порт (9000 в моем случае) и этот порт не занят.

Возьмем, к примеру, эту конфигурацию PhpStorm: Configuration

Устранение неполадок

Проверьте, установлен ли xdebug, запустите вphp-контейнер:

php -i | grep xdebug

Убедитесь, что вы редактируете соответствующие файлы .ini, отметьте:

php -i | grep \.ini

Еслиу вас включен idekey, обязательно настройте их в своей IDE:

config remote debug

В PhpStorm есть средство проверки отладчика, если вы представляете сценарии PHPна веб-сервере:

Validate

0 голосов
/ 06 июня 2019
  1. Вам следует открыть порт 9001 на хост-компьютере, а не в Docker.
  2. Также попробуйте проверить, правильно ли настроен Xdebug: добавьте phpinfo () в свой код и откройте эту страницу в браузере.Вы должны увидеть, что xdebug включен
  3. Если Xdebug включен, возможно, ваши настройки IDE неверны
...