Wie bekomme ich Opcodes von PHP?


73
  <?php
      $show_value   = 123;
      echo 'sing_quote'.$show_value;
      echo "double_quote{$show_value}";

  ?>

Sein Opcode lautet:

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

13
wow was für eine frage!
Mauris

9
Wer hat "keine echte Frage" gewählt? Das ist eine ausgezeichnete Frage!
Paul Dixon

die für keine wirkliche Frage gestimmt haben, weil sie für sie nicht im Fokus stehen.
Deep Kakkar

Antworten:


42

Schauen Sie sich die PECL-Erweiterung von Vulcan Logic Disassembler an - weitere Informationen finden Sie auf der Homepage des Autors .

Der Vulcan Logic Disassembler wird in die Zend Engine eingebunden und speichert alle Opcodes (Ausführungseinheiten) eines Skripts. Es wurde als Anfang eines Encoders geschrieben, aber dafür habe ich nie die Zeit bekommen. Es kann verwendet werden, um zu sehen, was in der Zend Engine vor sich geht.

Einmal installiert, können Sie es wie folgt verwenden:

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

Siehe auch diesen interessanten Blog-Beitrag zur Opcode-Extraktion und die PHP-Handbuchseite mit den verfügbaren Opcodes .


@ Paul Dixon Woher kennst du die Befehle nach dem PHP: "-d vld.active = 1 -d vld.execute = 0 -f" Ich habe mir die pecl vld angesehen und es gibt keine Dokumentation dafür. Vielen Dank im Voraus.
Starlays

Siehe zweiten Link im Beitrag.
Paul Dixon

12

Parsekit hat 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
));

Die Ausgabe ist ziemlich ausführlich, daher müssen Sie sie verarbeiten, um ein Assembler-ähnliches Format zu erhalten.

  ["opcodes"] =>
  Array (10) {
    [0] =>
    Array (9) {
      ["Adresse"] =>
      int (44682716)
      ["opcode"] =>
      int (101)
      ["opcode_name"] =>
      Zeichenfolge (13) "ZEND_EXT_STMT"
      ["flags"] =>
      int (4294967295)
      ["Ergebnis"] =>
      Array (8) {
        ["Typ"] =>
        int (8)
        ["Typname"] =>
        Zeichenfolge (9) "IS_UNUSED"
        ["var"] =>
        int (0)
        ["opline_num"] =>
        Zeichenfolge (1) "0"
        ["op_array"] =>
        Zeichenfolge (1) "0"
        ["jmp_addr"] =>
        Zeichenfolge (1) "0"
        ["jmp_offset"] =>
        Zeichenfolge (8) 35419039
        ["EA.type"] =>
        int (0)
      }}
      ["op1"] =>
      Array (8) {
        ["Typ"] =>
        int (8)
        ["Typname"] =>
        Zeichenfolge (9) "IS_UNUSED"
        ["var"] =>
        int (0)
        ["opline_num"] =>
        Zeichenfolge (1) "0"
        ["op_array"] =>
        Zeichenfolge (1) "0"
        ["jmp_addr"] =>
        Zeichenfolge (1) "0"
        ["jmp_offset"] =>
        Zeichenfolge (8) 35419039
        ["EA.type"] =>
        int (0)
      }}

1
Sie haben den Befehl falsch geschrieben. Sollte "sudo pecl install parsekit" sein.
MikeSchinkel

Inkompatibel mit PHP 5.4 :( .
Alix Axel

1
Die Parsekit-Inkompatibilität mit PHP 5.4 ist Gegenstand des Fehlers bugs.php.net/bug.php?id=61187 Remi-Spannzange hat einen Patch (ich habe ihn jedoch nicht getestet) github.com/remicollet/remirepo/blob/master / php / pecl /…
Antoine 'hashar' Musso
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.