Отделить Xdebug от контейнеров php-fpm и nginx

Я хотел отделить все свои инструменты разработки от основных контейнеров php-fpm и nginx. Итак, у меня в основном 3 контейнера с именем php-fpm, работающие на порту 9000, nginx на порту 80 и инструменты разработчика. Я установил xdebug, composer и т. д. В свой контейнер dev-tools, но я не понимаю, как настроить xdebug, чтобы он работал с контейнером php-fpm и мог отлаживать мой веб-сайт? Второй вопрос: нужен ли xdebug php-cli или php-fpm для запуска самого себя?

# dev-tools

FROM php:7.2-cli-alpine

# Install the PHP extensions we need
RUN set -ex \
    && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin -- --filename=composer.phar \
    && apk add --no-cache git \
    && pecl install xdebug \
    && docker-php-ext-enable xdebug

Я считаю, что xdebug должен быть в вашем контейнере php-fpm, чтобы вы могли отлаживать свои веб-приложения.

MikeSchinkel 09.11.2018 17:41
Стоит ли изучать 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 и хотите разрабатывать...
2
1
1 804
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

xdebug по умолчанию использует порт 9000, что конфликтует с портом PHP-FPM.

Вам нужно будет изменить назначенный порт конфигурации пула PHP-FPM или xdebug в php.ini. Я рекомендую обновить конфигурацию PHP-FPM, чтобы прослушивать другой порт, поскольку его проще настраивать для отладки с помощью xdebug.

Если вы хотите изменить порт в PHP-FPM.

/php-fpm.d/pool.conf

[pool]
listen = 127.0.0.1:9001

Обновите конфигурацию NGINX соответствующим образом, чтобы использовать новый порт.

В противном случае, если вы хотите изменить порт xdebug в PHP.

php.ini

[xdebug]
xdebug.remote_port=9001

Обновите программное обеспечение отладки (редактор PHP / IDE) и конфигурацию брандмауэра на новый порт. В качестве альтернативы используйте туннель SSH для перенаправления нового удаленного порта 9001 на локальный порт 9000 по умолчанию.


Что касается вашего второго вопроса

xdebug работает только как расширение PHP (php-fpm), если он настроен для загрузки в ваших настройках PHP ini. Он не работает как отдельная фоновая служба.

Пример:

[Browser Client -> http://example.com/path/to/script.php] 
   in -> [NGINX] 
        in -> [php-fpm /path/to/script.php] 
[xdebug remote host:port] <- out

или

[terminal command line] 
    in -> [php /path/to/script.php] 
[xdebug remote host:port] <-out

Итак, да, xdebug требует запуска php-fpm или php-cli, поскольку они одно и то же.

Если через Apache / NGINX, который использует php-fpm, его нужно будет загрузить в вашу конфигурацию fpm. Если через интерфейс CLI, его нужно будет загрузить в вашу конфигурацию CLI.

Имейте в виду, что вы можете запускать PHP с разными конфигурациями ini в зависимости от среды. См. PHP - файл конфигурации

Спасибо за вашу помощь. Сейчас собираюсь настроить. Не могли бы вы прояснить, в каком контейнере мне следует отредактировать файл php.ini и вставить строку «xdebug.remote_port = 9001». Должен ли он быть внутри контейнера php-fpm или dev-tools? Потому что я установил xdebug в контейнер dev-tools.

SkyRar 09.11.2018 19:38

В качестве контейнеров run as isolated processes. Если вы запускаете сайт через php-fpm и хотите отлаживать его с помощью xdebug, его необходимо настроить в вашем контейнере # php-fpm. И расширение xdebug также должно быть доступно из вашего контейнера # php-fpm. В соответствии с моими примерами запуска xdebug php-fpm -> xdebug. То же самое применимо, если вы запускаете сайт в своем контейнере # dev-tools.

Will B. 09.11.2018 19:57

Вам также не хватает одного ключа внутри xdebug.ini, то есть xdebug.remote_host=dev_tools. Пожалуйста, поправьте меня, если я ошибаюсь. Потому что я сомневаюсь, как php-fpm знает, куда направить дальше согласно NGINX -> php-fpm -> xdebug?

SkyRar 09.11.2018 20:05
xdebug отправляет свои данные на указанный xdebug.remote_host, по умолчанию это localhost, он не запускается и не запускается как отдельная служба, такая как php-fpm или nginx. Он запускается непосредственно через исполняемый экземпляр PHP. Я только объяснил, как решить проблему конфликта портов с конфигурациями по умолчанию. Я не знаю вашу конфигурацию сети докеров, но в том методе, который вы используете, вы хотели бы использовать туннель SSH, поэтому xdebug.remote_host будет оставлен по умолчанию.
Will B. 09.11.2018 20:15

Согласно документации xdebug.org/docs/remote remote_host - это место, где работает клиент отладки. Подскажите, пожалуйста, какой из них debug client? Это IP-адрес системы, в которой установлено расширение xdebug, или IP-адрес контейнера, в котором установлено xdebug?

SkyRar 09.11.2018 20:20

Вашим клиентом отладки будет ваш локальный компьютер, на котором запущена IDE, ожидающая получения удаленных данных xdebug. Вы также можете указать IP-адрес вашего локального компьютера в той же подсети, что и ваш веб-сервер. Скажем, если ваш веб-сервер - 192.168.56.100, а ваш локальный компьютер настроен на 192.168.56.1, вы должны установить xdebug.remote_host = 192.168.56.1, но вам нужно будет установить правило брандмауэра, чтобы разрешить входящий TCP / UDP с 192.168.56.100 на порт 9001. В противном случае вы бы использовали туннель SSH для захвата remote localhost:9001. и пересылаем на свой local localhost:9000

Will B. 09.11.2018 20:24

Кроме того, меня больше всего беспокоит то, как php-fpm взаимодействует с Xdebug? Вы сказали, что мне нужно вставить xdebug.remote_port=9001. Насколько я понимаю, это означает, что Xdebug будет взаимодействовать с расширением локального браузера через порт 9001. Но как Php-fpm сбивается с Xdebug? Как сказать Php-fpm, чтобы направить скрипт в xdebug?

SkyRar 09.11.2018 20:35
php-fpm - это PHP как процесс CGI. xdebug не поддерживает отправить данные / поговорить с php-fpm, php-fpm включает xdebug при запуске. Что должно быть включено с помощью docker-php-ext-enable xdebug. Который добавляет extension=xdebug.so в php.ini .. xdebug затем действует как дополнительный уровень в php, поскольку php читает ваш скрипт (ы). xdebug - это не служба, работающая в фоновом режиме, это расширение, запускаемое php. Когда xdebug включен, при использовании php -m из интерфейса командной строки будет выведен список xdebug. В противном случае запуск сценария с <?php phpinfo(); должен указать, что xdebug является включенным расширением.
Will B. 09.11.2018 20:47

Почему я спрашиваю о связи между php-fpm-> xdebug, когда я установил xdebug в отдельный контейнер, я вставил строку zend_extension = "/usr/local/php/modules/xdebug.so" в файл php.ini dev-tools. Обратите внимание, что /usr/local/php/modules/xdebug.so существует только в контейнере dev-tools, а не внутри контейнера php-fpm.

SkyRar 09.11.2018 20:48

@SkyRar Пожалуйста, прочтите документацию Xdebug: xdebug.org/docs/remote - в частности, раздел «Настройка связи».

LazyOne 09.11.2018 20:49

@SkyRar Согласно моему первому комментарию, вы должны установить xdebug с помощью php-fpm, чтобы php-fpm мог включить его как расширение. Он не будет доступен для php-fpm и контейнера # php-fpm из контейнера # dev-tools. Вот почему документация @LazyOne, на которую есть ссылка, показывает одну коробку как [PHP/xdebug], они - одно и то же.

Will B. 09.11.2018 20:54

@fyrye Хорошо, я знаю. Поэтому, если вы абсолютно уверены, что php-fpm и xdebug нельзя запускать в отдельных контейнерах, вы можете отредактировать свой ответ с помощью этой строки, поскольку вопрос заключался в том, чтобы отделить инструменты разработчика от контейнера php-fpm.

SkyRar 09.11.2018 20:59

@SkyRar разъяснил мой первоначальный ответ на ваш второй вопрос, xdebug работает только как расширение PHP, если он настроен на загрузку в ваших настройках PHP ini .. vs xdebug запускается на запрос при выполнении PHP

Will B. 09.11.2018 21:04

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