<rmcreative>

RSS

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

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.