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

    ?> 

그것의 연산 코드는 다음과 같습니다PHP의 opcodes를 얻는 방법?

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

와우! – mauris

+7

누가 "진짜 질문이 아닙니다"라고 투표 했습니까? 그것은 훌륭한 질문입니다! –

+0

누가 진짜 문제가 아니라고 투표했습니다. 왜냐하면 그들에게 초점이 맞지 않기 때문입니다. – Deep

답변

35

체크 아웃 Vulcan Logic Disassembler PECL 확장 - 추가 정보를 원하시면 author's home page를 참조하십시오.

벌컨 논리 디스어셈블러는 젠드 엔진에 후크 및 스크립트의 모든 옵 코드 (실행 단위)를 덤프합니다. 그것은 인코더의 시작 부분으로 작성되었지만, 시간을 얻지 못했습니다. Zend Engine에서 이 무엇인지 확인하는 데 사용할 수 있습니다.

일단 설치되면 다음과 같이 사용할 수 있습니다 :

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

는이 interesting blog post on opcode extraction하고 PHP manual page listing the available opcodes를 참조하십시오.

+0

너무 나쁜'vld'는 파일에서만 작동합니다. = \ –

+0

@ Paul Dixon PHP 다음 명령을 어떻게 알았습니까? "-d vld.active = 1 -d vld.execute = 0 -f"필자는 pldvld를 살펴 봤고 문서가 없습니다. advace에서 감사합니다. – Starlays

+0

게시물의 두 번째 링크를 참조하십시오. –

11

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

출력

은 매우 상세하다.

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

명령의 철자가 잘못되었습니다. "sudo pecl install parsekit"이어야합니다. – MikeSchinkel

+0

@MikeSchinkel 고마워요, 고침. – Kornel

+0

PHP 5.4와 호환되지 않습니다 ** : (**. –

관련 문제