Как получить коды операций 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 (также авторы этой статьи).

Другие вопросы по тегам