Как получить коды операций PHP?
<?php
$show_value = 123;
echo 'sing_quote'.$show_value;
echo "double_quote{$show_value}";
?>
Его код операции:
1: <?php
2: $show_value = 123;
0 ASSIGN !0, 123
3: echo 'sing_quote'.$show_value;
1 CONCAT 'sing_quote', !0 =>RES[~1]
2 ECHO ~1
4: echo "double_quote{$show_value}";
3 ADD_STRING 'double_quote' =>RES[~2]
4 ADD_VAR ~2, !0 =>RES[~2]
5 ECHO ~2
6 RETURN 1
4 ответа
Проверьте расширение PECL Vulcan Logic Disassembler - см . Домашнюю страницу автора для получения дополнительной информации.
Vulcan Logic Disassembler подключается к Zend Engine и сбрасывает все коды операций (исполнительные единицы) скрипта. Это было написано как начало кодера, но у меня никогда не было времени на это. Его можно использовать, чтобы увидеть, что происходит в Zend Engine.
После установки вы можете использовать его так:
php -d vld.active=1 -d vld.execute=0 -f yourscript.php
См. Также этот интересный пост в блоге по извлечению кода операции и страницу руководства PHP со списком доступных кодов операций.
Parsekit имеет http://uk3.php.net/parsekit_compile_string.
sudo pecl install parsekit
var_dump (parsekit_compile_string (<<< PHP \ $ show_value = 123; echo 'sing_quote'. \ $ show_value; echo "double_quote {\ $ show_value}"; PHP));
Вывод довольно подробный, поэтому вам нужно обработать его, чтобы получить формат, подобный ассемблеру.
[ "Опкоды"] => массив (10) { [0] => массив (9) { [ "Адрес"] => INT (44682716) ["Опкод"] => INT (101) [ "Opcode_name"] => строка (13) "ZEND_EXT_STMT" ["Флаги"] => INT (4294967295) ["Результат"] => массив (8) { ["Тип"] => Int(8) ["Type_name"] => строка (9) "IS_UNUSED" ["Переменная"] => Int (0) [ "Opline_num"]=> строка (1) "0" [ "Op_array"] => строка (1) "0" [ "Jmp_addr"] => строка (1) "0" [ "Jmp_offset"]=> Строка (8) "35419039" ["EA.type"]=> Int(0) } ["OP1"] => массив (8) { ["Тип"] => Int(8) ["Type_name"] => строка (9) "IS_UNUSED" ["Переменная"] => Int (0) [ "Opline_num"]=> строка (1) "0" [ "Op_array"] => строка (1) "0" [ "Jmp_addr"] => строка (1) "0" [ "Jmp_offset"]=> Строка (8) "35419039" ["EA.type"]=> Int (0) }
Вы можете запустить код, а также увидеть коды операций, если используете https://3v4l.org/
Примечание. Он автоматически отображает выходные данные Vulcan Logic Disassembler (VLD), но только если в раскрывающемся списке версий выбраны «все поддерживаемые версии».
Вот простой пример (показанный ниже для потомков): https://3v4l.org/Gt8fd/vld
Код:
<?php
$arr = [1, 2, 3, 4];
print_r(array_map(fn(int $i): int => $i * $i, $arr));
Результат:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename: /in/Gt8fd
function name: (null)
number of ops: 10
compiled vars: !0 = $arr
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E > ASSIGN !0, <array>
3 1 INIT_FCALL 'print_r'
2 INIT_FCALL 'array_map'
3 DECLARE_LAMBDA_FUNCTION '%00%7Bclosure%7D%2Fin%2FGt8fd%3A3%240'
4 SEND_VAL ~2
5 SEND_VAR !0
6 DO_ICALL $3
7 SEND_VAR $3
8 DO_ICALL
9 > RETURN 1
Function %00%7Bclosure%7D%2Fin%2FGt8fd%3A3%240:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename: /in/Gt8fd
function name: {closure}
number of ops: 6
compiled vars: !0 = $i
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
0 E > RECV !0
1 MUL ~1 !0, !0
2 VERIFY_RETURN_TYPE ~1
3 > RETURN ~1
4* VERIFY_RETURN_TYPE
5* > RETURN null
End of function %00%7Bclosure%7D%2Fin%2FGt8fd%3A3%240
Generated using Vulcan Logic Dumper, using php 8.0.0
Два варианта, установкаopcache.opt_debug_level
Настройка INI или использованиеphpdbg
двоичный файл предоставляется в среде PHP с поддержкой отладки (например, требуется либо скомпилировать PHP из исходного кода, либо установить соответствующий пакет в Linux).
Для получения дополнительной информации и полного руководства обратитесь к этой статье php.watch (также авторы этой статьи).