Известно, что 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;
    }

}
“Удалённое” включение xdebug на сервере
Tagged on:         

Leave a Reply