XDebug и Docker
28 декабря 2023
Использовать XDebug образах Docker для прода долго было плохой идеей так как само наличие XDebug меняло генерируемые PHP опкоды. Из-за этого частенько использовались несколько образов (для разработки и для прода), наследуемые друг от друга.
Несколько лет назад автор XDebug Derick Rethans сказал мне что с релизом XDebug 3 проблема стала не актуальной, но тогда я это лично не проверял.
На недавнем митапе сообщества PHP Кирилл Несмеянов проводил PHP викторину. Один из вопросов был «Сколько вызовов функций в коде, если включен Xdebug?»:
function example() { return 42; }
example();
Кирилл озвучил опасение что даже если XDebug установлен, но не включен, то опкоды будут меняться. Давайте это проверим.
Код выше положим в test.php
. Теперь получим опкоды. Для этого запустим PHP вот так:
phpdbg -p* -d opcache.opt_debug_level=0x20000 test.php
Когда XDebug 3 установлен без какой-либо конфигурации в php.ini
кроме включения модуля через zend_extension=php_xdebug-3.3.1-8.2-vs16-nts-x86_64.so
:
$_main: ; (lines=4, args=0, vars=0, tmps=2) ; C:\src\playground\test.php:1-5 L0004 0000 EXT_STMT L0004 0001 INIT_FCALL 0 96 string("example") L0004 0002 DO_FCALL L0005 0003 RETURN int(1) example: ; (lines=4, args=0, vars=0, tmps=1) ; C:\src\playground\test.php:3-3 L0003 0000 EXT_STMT L0003 0001 RETURN int(42) L0003 0002 EXT_STMT L0003 0003 RETURN null
Теперь выключим его через xdebug.mode=off
:
$_main: ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; C:\src\playground\test.php:1-5 0000 RETURN int(1) example: ; (lines=1, args=0, vars=0, tmps=0) ; (after optimizer) ; C:\src\playground\test.php:3-3 0000 RETURN int(42) $_main: ; (lines=1, args=0, vars=0, tmps=0) ; C:\src\playground\test.php:1-5 L0005 0000 RETURN int(1) example: ; (lines=1, args=0, vars=0, tmps=0) ; C:\src\playground\test.php:3-3 L0003 0000 RETURN int(42)
Итого Derick был прав. Если XDebug явно отключен, то на выполнение PHP он не влияет и его можно смело засунуть в основной образ Docker.
Комментарии RSS по email OK