Как загрузить модуль Xdebug в PHP без снижения производительности? - PullRequest
0 голосов
/ 02 апреля 2020

TLDR:

Когда Xdebug загружается как модуль PHP, он требует значительных потерь производительности, даже если он полностью отключен. [1]

Можно ли загрузить модуль Xdebug без ЛЮБЫХ потерь производительности?

Учитывая, конечно, что он имеет потери производительности, когда он активно отладка (при наличии отладочной команды ie в HTTP-запросах или в CLI, через серию -dxdebug параметров для ее включения) или при профилировании.

Полное объяснение:

Я исследовал проблемы с низкой производительностью при запуске комплекта интеграционных тестов. Это заняло 2 минуты, чтобы запустить весь набор. Я отключил все, что можно было отключить на Xdebug, пока, наконец, не решил полностью удалить сам модуль из PHP. Когда я сделал это, пакет интеграции занял 56 секунд. Почти в два раза быстрее.

Я начал копаться в этом и увидел, что это общая проблема. Снова [1] в качестве ссылки. Вот настройки, которые я использую:

xdebug.remote_autostart         = Off
xdebug.default_enable           = Off
xdebug.profiler_enable_trigger  = Off
xdebug.remote_enable            = Off
xdebug.remote_handler           = dbgp
xdebug.remote_port              = 9000
xdebug.idekey                   = PHPSTORM
xdebug.remote_log               = /var/log/php/xdebug.log

И это версия PHP / Xdebug:

PHP 7.4.2 (cli) (built: Feb  1 2020 19:47:36) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.2, Copyright (c), by Zend Technologies
    with Xdebug v2.9.2, Copyright (c) 2002-2020, by Derick Rethans

Я видел эту разницу в PHP CLI.

[1] Связанный:

1 Ответ

1 голос
/ 03 апреля 2020

Хорошо, я понял, по крайней мере для PHP CLI.

Это отключит Xdebug для веб-запросов, но вы сможете запускать команды CLI с и без Xdebug. Если вы пишете много автоматических тестов, это может стоить.

Во-первых, полностью отключите Xdebug. Запустите php --version, чтобы подтвердить, что вы не видите такой строки "с Xdebug v2.9.2, Copyright (c) 2002-2020 by Derick Rethans".

Затем выполните php -i | grep ^extension_dir, чтобы узнайте, где хранятся ваши PHP расширения. CD в ​​эту папку и проверьте, можете ли вы найти xdebug.so там.

Теперь, запустите php с параметром -dzend_extension=YOUR_XDEBUG.SO_PATH, чтобы загрузить Xdebug. Пример:

php --version

Дает:

PHP 7.4.2 (cli) (built: Feb  1 2020 19:47:36) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.2, Copyright (c), by Zend Technologies

php -dzend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20190902/xdebug.so --version

Дает:

PHP 7.4.2 (cli) (built: Feb  1 2020 19:47:36) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.2, Copyright (c), by Zend Technologies
    with Xdebug v2.9.2, Copyright (c) 2002-2020, by Derick Rethans

В моем В этом случае я создал псевдоним bash с несколькими дополнительными параметрами для более детального управления:

alias phpx='PHP_IDE_CONFIG="serverName=someServerNameInPHPStorm" php -dzend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20190902/xdebug.so -dxdebug.remote_autostart=1 -dxdebug.remote_enable=1 -dxdebug.default_enable=1 -dxdebug.remote_connect_back=1 -dxdebug.remote_handler=dbgp -dxdebug.remote_port=9000 -dxdebug.idekey=PHPSTORM -dxdebug.remote_host=127.0.0.1';

Поэтому я использую его следующим образом: phpx run_something.php для запуска с Xdebug и php run_something.php без, для оптимальной производительности.

Спасибо @LazyOne за совет, и я надеюсь, что Xdebug исправит эту проблему производительности, потому что, как я уже сказал, этот обходной путь не будет работать для веб-запросов.

...