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

    ?> 

Su código de operación es:¿Cómo obtener los códigos de operación de 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

¡qué pregunta! – mauris

+7

¿Quién votó "no es una pregunta real"? ¡Es una excelente pregunta! –

+0

que votaron por una pregunta no real, porque para ellos está fuera de foco. – Deep

Respuesta

35

Mira la extensión PECL Vulcan Logic Disassembler - ver author's home page para obtener más información.

El Vulcan lógica desensamblador engancha en el motor de Zend y vuelca todas las códigos de operación (unidades de ejecución) de una secuencia de comandos. Se escribió como un comienzo de un codificador , pero nunca tuve el tiempo para que. Puede usarse para ver qué está sucediendo en el motor Zend.

Una vez instalado, puede utilizar de esta manera:

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

Ver también este interesting blog post on opcode extraction, y el PHP manual page listing the available opcodes.

+0

Lástima 'vld' solo funciona con archivos. = \ –

+0

@Paul Dixon cómo conocía los comandos después de php: "-d vld.active = 1 -d vld.execute = 0 -f" eché un vistazo al pecl vld y no hay documentación para él. Gracias en advace – Starlays

+0

Ver el segundo enlace en la publicación. –

11

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

La salida es bastante detallado, por lo que había necesidad de procesarla para obtener formato de ensamblador similar.

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

Ha escrito mal el comando. Debería ser "sudo pecl install parsekit". – MikeSchinkel

+0

@MikeSchinkel Gracias, corregido. – Kornel

+0

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

Cuestiones relacionadas