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

    ?> 

suo codice operativo è:Come ottenere gli opcode di 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 che domanda! – mauris

+7

chi ha votato "non è una vera domanda"? È una domanda eccellente! –

+0

che hanno votato per non vera domanda, perché per loro è fuori dal loro obiettivo. – Deep

risposta

35

Controllare l'estensione Vulcan Logic Disassembler PECL - vedi author's home page per maggiori informazioni.

Vulcan Logic Disassembler aggancia nel motore Zend e discariche tutte le codici operativi (unità di esecuzione) di uno script. È stato scritto come un inizio di un codificatore , ma non ho mai avuto il tempo per . Può essere usato per vedere che cosa è in corso nel motore Zend.

Una volta installato, è possibile utilizzarlo in questo modo:

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

Vedi anche questo interesting blog post on opcode extraction, e il PHP manual page listing the available opcodes.

+0

Peccato che 'vld' funzioni solo con i file. = \ –

+0

@Paul Dixon come facevi a sapere i comandi dopo il php: "-d vld.active = 1 -d vld.execute = 0 -f" ho dato un'occhiata al pecl vld e non c'è documentazione per questo. Grazie in anticipo. – Starlays

+0

Vedere il secondo link in post. –

11

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

L'uscita è abbastanza prolisso, così avresti bisogno di elaborarlo per ottenere formato assemblatore-like.

 
    ["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

Hai sbagliato a digitare il comando. Dovrebbe essere "sudo pecl install parsekit." – MikeSchinkel

+0

@MikeSchinkel Grazie, risolto. – Kornel

+0

Incompatibile con PHP 5.4 **: (**. –

Problemi correlati