Как получить коды операций 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

person Mask    schedule 25.11.2009    source источник
comment
ух какой вопрос!   -  person mauris    schedule 25.11.2009
comment
кто проголосовал не реальный вопрос? Это отличный вопрос!   -  person Paul Dixon    schedule 25.11.2009
comment
кто проголосовал за не реальный вопрос, потому что для них это не в их фокусе.   -  person Deep Kakkar    schedule 08.03.2016


Ответы (2)


Ознакомьтесь с расширением PECL Vulcan Logic Disassembler — см. домашняя страница автора для получения дополнительной информации.

Дизассемблер Vulcan Logic подключается к Zend Engine и выводит все коды операций (единицы выполнения) скрипта. Он был написан как начало энкодера, но у меня никогда не было на это времени. Его можно использовать для просмотра того, что происходит в Zend Engine.

После установки вы можете использовать его следующим образом:

php -d vld.active=1 -d vld.execute=0 -f yourscript.php

См. также этот интересный пост в блоге о извлечении кода операции и Справочная страница PHP со списком доступных кодов операций.

person Paul Dixon    schedule 25.11.2009
comment
@Paul Dixon, как вы узнали команды после php: -d vld.active=1 -d vld.execute=0 -f я взглянул на pecl vld, и для него нет документации. Заранее спасибо. - person Starlays; 30.10.2013
comment
Смотрите вторую ссылку в посте. - person Paul Dixon; 30.10.2013

Parsekit имеет 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
));

Вывод довольно подробный, поэтому вам нужно обработать его, чтобы получить формат, подобный ассемблеру.

  ["opcodes"]=>
  array(10) {
    [0]=>
    array(9) {
      ["address"]=>
      int(44682716)
      ["opcode"]=>
      int(101)
      ["opcode_name"]=>
      string(13) "ZEND_EXT_STMT"
      ["flags"]=>
      int(4294967295)
      ["result"]=>
      array(8) {
        ["type"]=>
        int(8)
        ["type_name"]=>
        string(9) "IS_UNUSED"
        ["var"]=>
        int(0)
        ["opline_num"]=>
        string(1) "0"
        ["op_array"]=>
        string(1) "0"
        ["jmp_addr"]=>
        string(1) "0"
        ["jmp_offset"]=>
        string(8) "35419039"
        ["EA.type"]=>
        int(0)
      }
      ["op1"]=>
      array(8) {
        ["type"]=>
        int(8)
        ["type_name"]=>
        string(9) "IS_UNUSED"
        ["var"]=>
        int(0)
        ["opline_num"]=>
        string(1) "0"
        ["op_array"]=>
        string(1) "0"
        ["jmp_addr"]=>
        string(1) "0"
        ["jmp_offset"]=>
        string(8) "35419039"
        ["EA.type"]=>
        int(0)
      }
person Kornel    schedule 28.02.2012
comment
Вы неправильно написали команду. Должен быть sudo pecl install parsekit. - person MikeSchinkel; 27.09.2012
comment
Несовместимо с PHP 5.4 :(. - person Alix Axel; 31.05.2013
comment
Несовместимость parsekit с PHP 5.4 является предметом ошибки bugs.php.net/bug.php. ?id=61187 Remi Collet имеет патч (хотя я его не проверял) github.com/remicollet/remirepo/blob/master/php/pecl/ - person Antoine 'hashar' Musso; 07.07.2013