Известно, что xdebug “замедляет” работу сервера. При отладке без него как без рук, но в тоже время отладкой занимаешься сильно реже, чем “любуешься” изувеченными стек-трейсами. К браузерам имеются расширения для включения/отключения отладочного режима на открытом в данный момент сайте, но “отключается” лишь клиентская часть. Захотелось аналогичную кнопку для того, чтобы отключать (точнее включать отключенный по умолчанию) xdebug на сервере – примерно так же, как реализовано в phpstorm, где xdebug загружается только при запуске скрипта в debug-режиме.
Конечно “на ходу” загружать/выгружать xdebug не получится, но можно заранее запустить два процесса – один “production”, второй – с загруженным xdebug. Остаётся вопрос – как между ними переключаться ?
Первая мысль – сделать виртуальный хост со специальным именем (https://debug.site.dev) или на отдельном порту (https://site.dev:9999/) . Однако это “не работает” в реальной эксплуатации – просто неудобно переходить на другой сайт и долго и нудно воссоздавать клиентское “окружение” в котором возникла проблема, требующая вмешательства с отладчиком. Хочется столкнувшись с ситуацией из которой без отладчика не выпутаться просто нажать на кнопку и “нутро” следующего http-запроса уже наблюдать в IDE (как и происходит обычно, когда xdebug постоянно загружен).
В общем отдельная кнопка не нужна – существующие “xdebug helper-ы” к браузерам работают просто – при включении отладочного режима они устанавливают на текущем домене cookie с именем XDEBUG_SESSION. Эта же cookie поможет отделить “отладочные” запросы от “рабочих”.
Итак решение – запускаем два php-fpm на разных портах, один из них с загруженным xdebug, nginx в зависимости от наличия “отладочной” cookie проксирует запросы к разным upstream c php-fpm:
#nginx.conf upstream php72 { server 127.0.0.1:9000; } upstream php72-xdebug { server 127.0.0.1:9001; } server { server_name site.dev; set $phpfpm "php72"; # по умолчанию запросы к "боевому" php if ($http_cookie ~* "XDEBUG_SESSION=.+") { # есть отладочная cookie? set $phpfpm "php72-xdebug"; } if ($args ~* "XDEBUG_SESSION_START=.+") { # есть отладочный параметр в QUERY_STRING? set $phpfpm "php72-xdebug"; } ... location ~ ^(.+\.php)(.*)$ { ... include fastcgi_params; fastcgi_pass $phpfpm; } }