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
Maske
quelle
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
quelle
@ 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)
      }}
Kornel
quelle
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