Можно ли как-то быстро включить / отключить xdebug? Без изменения php.ini и перезагрузки сервера?

165
14 апреля 2019, 17:50

Страницы моего сайта без xdebug грузятя за несколько миллисекунд, а с xdebug за 5 секунд - минимум. А бывает и дольше. Мне не всегда нужен xdebug. Я хочу иногда отключать его. И иногда включать. Но делать это без изменения php.ini и без перезагрузки сервера, а побыстрее. Как я могу это делать? Нажатием какой-нибудь кнопки, например. Или комментированием кода. Я попробовал вот такой код:

if (function_exists('xdebug_disable')) {
   xdebug_disable();
}

Но сайт все равно тормозит.

Answer 1

Включенный xDebug, не должен замедлять работу. Попробуйте следующее:

1) попробуйте в php.ini, оставить настройки по минимуму, только те, что вам нужны, например, если у вас включен профайлер, отключите его.

2) Пока вам не нужен дебаггер, отключайте прослушку в свой среде разработки.

3) Если вы отключили прослушку (п.2), а у вас все по-прежнему медленно, попробуйте убедится, что она действительно отключена. В php.ini узнайте порт, на который xdebug шлет запросы, далее проверьте, работает ли он telnet localhost {ВАШ_ПОРТ}. Если порт работает, то среда разработки не корректно завершает работу прослушки

Вроде как все просто, но возможно, что-то поможет.

Answer 2

Я использую скрипт, который редактирует php.ini и рестартует php-fpm. Включение / отключение занимает доли секунды.

Вот пример bash-файла, который позволяет включать и отключать xdebug, а также включать профайлер.

ini_file="/etc/php.d/xdebug.ini"
if [ -z $1 ]
then
    if grep -q '\;zend_extension' "$ini_file"
    then
        echo 'xdebug is OFF'
        exit 0
    fi
    if grep -q 'xdebug.profiler_enable=0' "$ini_file"
    then
        echo 'xdebug is ON'
        exit 0
    else
        echo 'xdebug is PROF'
        exit 0
    fi
fi
if [ 'on' = $1 ]
then
    sed -i s/^\;zend_extension/zend_extension/g $ini_file
    sed -i s/^\xdebug.profiler_enable=1/xdebug.profiler_enable=0/g $ini_file
    systemctl restart php-fpm
    exit 0
fi
if [ 'prof' = $1 ]
then
    sed -i s/^\;zend_extension/zend_extension/g $ini_file
    sed -i s/^\xdebug.profiler_enable=0/xdebug.profiler_enable=1/g $ini_file
    systemctl restart php-fpm
    exit 0
fi
if [ 'off' = $1 ]
then
    sed -i s/^zend_extension/\;zend_extension/g $ini_file
    sed -i s/^\xdebug.profiler_enable=1/xdebug.profiler_enable=0/g $ini_file
    systemctl restart php-fpm
    exit 0
fi
echo 'argument can be "on", "off" or "prof" only'
exit 1

Использование (если этот файл назван xdebug):

  • xdebug on - включает xdebug
  • xdebug prof - включает xdebug + профайлер
  • xdebug off - выключает xdebug и профайлер
  • xdebug - выводит информацию о текущем статусе
Answer 3

Как по мне все волшебные скрипты которые то включают, то отключают xDebug весьма себе шаманство, однако имеют место быть.

Если бы мне у меня была крайняя необходимость дебажить на продакшене (ну вдруг) я бы использовал бы чуть другой подход.

Я могу ошибаться, однако даже "выключеный" xDebug замедляет работу. Под выключеным я понимаю xdebug.remote_enable=0 . Все дело в том что он загружен модулем и соответственно работает.

Что касается другого подхода. Ежели вы используете php-fpm, я бы создал две конфигурации в одной из которых модуль не подгружается, а в другой модуль подгружается. Запустил бы эти конфигуации на разных портах. Далее то что мы называем продакшн - ваш веб сервер отсылает на тот демон, который без загруженого модуля, а вот для дебага - создаете дополнительный хост в веб сервере с другим DNS именем или попросту слушаете на другом порту и в этой конфигурации отправляете ваш запрос на второй демон php-fpm который как раз с загруженым модулем xdebug.

Получаете весьма прозрачную штуку без каких либо мегаскриптов.

Возникла надобность - подняли php-fpm с xDebug, пропала надобность - прибили. Ну и конечно же дополнительными интсрументами можете ограничить доступ к дебажному варианту только на ваш ip, например.

Ну и само собой у вас нет ровным счетом ни какой надобность перегружать сервисы либо сервер (кто перегружает сервер ?).

READ ALSO
Как сделать MySQL AUTO_INCREMENT uniqe id рандомальный?

Как сделать MySQL AUTO_INCREMENT uniqe id рандомальный?

Как сделать к примеру ID 600000 при добавлении новой строчки? Чтоб был рандом например 6000023 следущий 6000073 и так далее

141
Запись в БД одной кнопкой

Запись в БД одной кнопкой

Есть цикл где выводятся записи из БДВ цикле есть форма с кнопкой "ОК"

168
MYSQL Insert создает две строчки

MYSQL Insert создает две строчки

Отправляю некоторые данные с помощью PHP на ДБ

139