Я хотел отделить все свои инструменты разработки от основных контейнеров 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 по умолчанию использует порт 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.
В качестве контейнеров run as isolated processes. Если вы запускаете сайт через php-fpm и хотите отлаживать его с помощью xdebug, его необходимо настроить в вашем контейнере # php-fpm. И расширение xdebug также должно быть доступно из вашего контейнера # php-fpm. В соответствии с моими примерами запуска xdebug php-fpm -> xdebug. То же самое применимо, если вы запускаете сайт в своем контейнере # dev-tools.
Вам также не хватает одного ключа внутри xdebug.ini, то есть xdebug.remote_host=dev_tools. Пожалуйста, поправьте меня, если я ошибаюсь. Потому что я сомневаюсь, как php-fpm знает, куда направить дальше согласно NGINX -> php-fpm -> xdebug?
xdebug отправляет свои данные на указанный xdebug.remote_host, по умолчанию это localhost, он не запускается и не запускается как отдельная служба, такая как php-fpm или nginx. Он запускается непосредственно через исполняемый экземпляр PHP. Я только объяснил, как решить проблему конфликта портов с конфигурациями по умолчанию. Я не знаю вашу конфигурацию сети докеров, но в том методе, который вы используете, вы хотели бы использовать туннель SSH, поэтому xdebug.remote_host будет оставлен по умолчанию.
Согласно документации xdebug.org/docs/remote remote_host - это место, где работает клиент отладки. Подскажите, пожалуйста, какой из них debug client? Это IP-адрес системы, в которой установлено расширение xdebug, или IP-адрес контейнера, в котором установлено xdebug?
Вашим клиентом отладки будет ваш локальный компьютер, на котором запущена 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
Кроме того, меня больше всего беспокоит то, как php-fpm взаимодействует с Xdebug? Вы сказали, что мне нужно вставить xdebug.remote_port=9001. Насколько я понимаю, это означает, что Xdebug будет взаимодействовать с расширением локального браузера через порт 9001. Но как Php-fpm сбивается с Xdebug? Как сказать Php-fpm, чтобы направить скрипт в xdebug?
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 является включенным расширением.
Почему я спрашиваю о связи между 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 Пожалуйста, прочтите документацию Xdebug: xdebug.org/docs/remote - в частности, раздел «Настройка связи».
@SkyRar Согласно моему первому комментарию, вы должны установить xdebug с помощью php-fpm, чтобы php-fpm мог включить его как расширение. Он не будет доступен для php-fpm и контейнера # php-fpm из контейнера # dev-tools. Вот почему документация @LazyOne, на которую есть ссылка, показывает одну коробку как [PHP/xdebug], они - одно и то же.
@fyrye Хорошо, я знаю. Поэтому, если вы абсолютно уверены, что php-fpm и xdebug нельзя запускать в отдельных контейнерах, вы можете отредактировать свой ответ с помощью этой строки, поскольку вопрос заключался в том, чтобы отделить инструменты разработчика от контейнера php-fpm.
@SkyRar разъяснил мой первоначальный ответ на ваш второй вопрос, xdebug работает только как расширение PHP, если он настроен на загрузку в ваших настройках PHP ini .. vs xdebug запускается на запрос при выполнении PHP
Я считаю, что xdebug должен быть в вашем контейнере php-fpm, чтобы вы могли отлаживать свои веб-приложения.