<?xml version="1.0" encoding="UTF-8" ?><oembed><version>1.0</version><provider_name>Чудо{вищные} заметки</provider_name><provider_url>https://miracle.rpz.name</provider_url><author_name>MiRacLe</author_name><author_url>https://miracle.rpz.name/author/miracle/</author_url><title>&quot;Удалённое&quot; включение xdebug на сервере</title><html>&lt;a rel=&quot;tn&quot; href=&quot;https://miracle.rpz.name/shared/phpstorm-interpeter-xdebug.png&quot;&gt;&lt;img class=&quot;alignright wp-image-981&quot; src=&quot;https://miracle.rpz.name/shared/phpstorm-interpeter-xdebug-1.png&quot; alt=&quot;&quot; width=&quot;200&quot; height=&quot;162&quot; /&gt;&lt;/a&gt;Известно, что &lt;a href=&quot;https://xdebug.org/&quot;&gt;xdebug&lt;/a&gt; &quot;замедляет&quot; работу сервера. При отладке без него как без рук, но в тоже время отладкой занимаешься сильно реже, чем &quot;любуешься&quot; изувеченными стек-трейсами. К браузерам имеются расширения для включения/отключения отладочного режима на открытом в данный момент сайте, но &quot;отключается&quot; лишь клиентская часть. Захотелось аналогичную кнопку для того, чтобы отключать (точнее включать отключенный по умолчанию) xdebug на сервере - примерно так же, как реализовано в phpstorm, где xdebug загружается только при запуске скрипта в debug-режиме.

Конечно &quot;на ходу&quot; загружать/выгружать xdebug не получится, но можно заранее запустить два процесса - один &quot;production&quot;, второй - с загруженным xdebug. Остаётся вопрос - как между ними переключаться ? &lt;!--more--&gt;

Первая мысль - сделать виртуальный хост со специальным именем  (https://debug.site.dev) или на отдельном порту (https://site.dev:9999/) . Однако это &quot;не работает&quot; в реальной эксплуатации - просто неудобно переходить на другой сайт и долго и нудно воссоздавать клиентское &quot;окружение&quot; в котором возникла проблема, требующая вмешательства с отладчиком. Хочется столкнувшись с ситуацией из которой без отладчика не выпутаться просто нажать на &lt;em&gt;кнопку&lt;/em&gt; и &quot;нутро&quot; следующего http-запроса уже наблюдать в IDE (как и происходит обычно, когда xdebug постоянно загружен).

&lt;p&gt;&lt;a href=&quot;https://miracle.rpz.name/shared/browser-xdebug-helper.png&quot;&gt;&lt;img class=&quot;alignleft size-full wp-image-982&quot; src=&quot;https://miracle.rpz.name/shared/browser-xdebug-helper.png&quot; alt=&quot;&quot; width=&quot;122&quot; height=&quot;173&quot; /&gt;&lt;/a&gt;В общем  отдельная &lt;em&gt;кнопка&lt;/em&gt; не нужна - существующие &quot;xdebug helper-ы&quot; к браузерам работают просто - при включении отладочного режима они устанавливают на текущем домене cookie с именем XDEBUG_SESSION. Эта же cookie поможет отделить &quot;отладочные&quot; запросы от &quot;рабочих&quot;.&lt;/p&gt;
&lt;div class=&quot;clearfix&quot;&gt;&nbsp;&lt;/div&gt;

&lt;p&gt;Итак решение - запускаем два php-fpm на разных портах, один из них с загруженным xdebug, nginx в зависимости от наличия &quot;отладочной&quot; cookie проксирует запросы к разным upstream c php-fpm:

&lt;pre&gt;
#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 &quot;php72&quot;; # по умолчанию запросы к &quot;боевому&quot; php
    if ($http_cookie ~* &quot;XDEBUG_SESSION=.+&quot;) { # есть отладочная cookie?
        set $phpfpm &quot;php72-xdebug&quot;; 
    }

    if ($args ~* &quot;XDEBUG_SESSION_START=.+&quot;) { # есть отладочный параметр в QUERY_STRING?
        set $phpfpm &quot;php72-xdebug&quot;; 
    }
    ...


    location ~ ^(.+\.php)(.*)$ {
        ...
        include fastcgi_params;
        fastcgi_pass $phpfpm;
    }

}&lt;/pre&gt;
&lt;/div&gt;</html><type>rich</type></oembed>