2009-11-25 4 views
62
<?php 
     $show_value = 123; 
     echo 'sing_quote'.$show_value; 
     echo "double_quote{$show_value}"; 

    ?> 

Sein Opcode ist:Wie bekomme ich Opcodes von PHP?

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 
+11

wow was für eine Frage! – mauris

+7

wer wählte "keine echte Frage"? Es ist eine ausgezeichnete Frage! –

+0

wer für nicht wirklich Frage gestimmt hat, denn für sie ist es aus ihrem Fokus. – Deep

Antwort

35

Überprüfen Sie die Vulcan Logic Disassembler PECL-Erweiterung aus - siehe author's home page für weitere Informationen.

Die Vulcan Logic Disassembler Haken in die Zend Engine und Dumps alle Opcodes (Ausführungseinheiten) eines Skripts. Es wurde als Anfang eines Encoders geschrieben, aber ich habe nie die Zeit für das 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 diese interesting blog post on opcode extraction und die PHP manual page listing the available opcodes.

+0

Schade 'vld' funktioniert nur mit Dateien. = \ –

+0

@Paul Dixon woher kennst du die Befehle nach dem php: "-d vld.active = 1 -d vld.execute = 0 -f" ich habe mir den pecl vld angeschaut und es gibt keine dokumentation dafür. Danke im Advice. – Starlays

+0

Siehe zweiten Link im Beitrag. –

11

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

Der Ausgang ist ziemlich ausführlich, so dass Sie es verarbeiten bräuchten Assembler-ähnliches Format zu bekommen.

 
    ["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) 
     } 
+1

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

+0

@MikeSchinkel Danke, behoben. – Kornel

+0

Inkompatibel mit PHP 5.4 **: (**. –