狠狠撸

狠狠撸Share a Scribd company logo
了解笔贬笔内核
12年10月29日星期?一
我是……
                Er、T0ny
                中心的学生
                写PHP的程序员
                喜欢各种折腾



12年10月29日星期?一
PHP代码是如何被执行的?




12年10月29日星期?一
颁代码         PHP代码

                gcc -o xxx    ???


                 $> xxx

12年10月29日星期?一
PHP的生命周期




12年10月29日星期?一
mod_php     cli         cgi/fastcgi ...

                                                                       SAPI



                                       PHP API
                                          streams, output, etc.


                 PHP (core)
                                      Extensions
                                       mysql , standard library, etc




                Zend API      Zend Extension API


                            Zend Engine
12年10月29日星期?一
$ php test.php

                           Call Each extension’s MINIT

                                 Request test.php

                           Call Each extension’s RINIT

                                    Execute test.php

                        Call Each extension’s RSHUTDOWN

                         Finish cleaning up after test.php

                        Call Each extension’s MSHUTDOWN

                Terminate php




12年10月29日星期?一
PHP脚本的执行




12年10月29日星期?一
笔贬笔内核
      <?php
         echo “hi”;     词法分析
      ?>
                        语法分析


                       Zend Engine
                      (执行 opCodes)
                hi



12年10月29日星期?一
词法分析
                Lex/Flex/re2c



12年10月29日星期?一
array (
                   array (
 <?php               0 => 368, // #define T_OPEN_TAG 368
                     1 => '<?php',
    echo $hi;        2 => 1, // LINE NO
 ?>                ),
                   array (
                     0 => 316, // #define T_ECHO 316
                     1 => 'echo',
                     2 => 2,
                   ),
                   array (
                     0 => 371, // #define T_WHITESPACE 371
                     1 => ' ',
                     2 => 2,
 token_get_all     ),
                   array (
                     0 => 309, // #define T_VARIABLE 309
                     1 => '$haha',
                     2 => 2,
                   ),
                   4 => ';',
                 )
                 @see Zend/zend_language_parser.c
12年10月29日星期?一
<?php      T_OPEN_TAG   ?>       T_CLOSE_TAG




                $var   T_VARIABLE    if         T_IF




          function     T_FUNCTION   for        T_FOR




                echo     T_ECHO     exit       T_EXIT




                        123 tokens         php5.3

12年10月29日星期?一
语法分析
                Yacc/Bison



12年10月29日星期?一
T_ECHO echo_expr_list ';'



       echo_expr_list:
              echo_expr_list ',' expr { ... }
          |   expr                    { ... }



      { ... }

                     zend_do_echo()
12年10月29日星期?一
void zend_do_echo(const znode *arg TSRMLS_DC)
 {
    zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);

      opline->opcode = ZEND_ECHO;
      opline->op1 = *arg;
      SET_UNUSED(opline->op2);
 }

 @see Zend/zend_compile.c




                  zend_op 出场!


12年10月29日星期?一
struct _zend_op {
       // 执行该opcode时调用的处理函数
       opcode_handler_t handler;
       znode result;
       znode op1;
       znode op2;
       ulong extended_value;
       uint lineno;
       zend_uchar opcode; // opcode代码
    };




12年10月29日星期?一
opcodes的执行




12年10月29日星期?一
switch           call            goto


    switch (opcode){                    switch (opcode){
     case ZEND_ADD:                         case ZEND_ADD:
     break;                                   goto zend_add:
     case ZEND_CALL:                          break;
     break;                             ...
                                        zend_add:



                         call ZEND_ADD_HANDLER()



12年10月29日星期?一
opcode * 25
          + zend_vm_decode[op->op1.op_type] * 5
          + zend_vm_decode[op->op2.op_type];



          static const opcode_handler_t labels[]




                3851 indexs           php5.3


12年10月29日星期?一
zend_op



                op_array   zend_op



                           zend_op


                            ...



12年10月29日星期?一
symbol_talble

                *active_op_array       *active_symbol_talble


                op_array1           op_array2           ...

           execute_data            execute_data         ...




12年10月29日星期?一
让我们再来?一次……




12年10月29日星期?一
.php           SAPI             Compiler
       ? Firefox/Chrome   ? Apache/Nginx       ? 词法分析
       ? Console          ? CLI                ? 语法分析
                          ? Embed




                             Executor          OPCODES
                Output                         ? Main Script
                Buffer    ? Switch/Call/Goto
                                               ? Function Table
                          ?Console
                                               ? Class Table




12年10月29日星期?一
Finally……




12年10月29日星期?一
<?php
                	$a = 3;
                	$b = 5;

                	if($a = 5 || $b = 7) {
                	        $a++;
                	        $b++;
                	}

                     $a=? $b=?
12年10月29日星期?一
<?php
                	$a = 3;
                	$b = 5;

                	if( $a = 5 || $b = 7
                     $a                 ) {
                	        $a++;
                	        $b++;
                	}

            答案:
            Zend/zend_language_parser.y
12年10月29日星期?一
对于罢滨笔滨


                www.php-internal.com




12年10月29日星期?一
reeze   er




                        pan




12年10月29日星期?一
Q&A



12年10月29日星期?一
谢 谢

                欢迎联系我:

                QQ:487223*

                email: er@zhangabc.com

                gtalk: er@zhangabc.com

                blog: www.zhangabc.com



12年10月29日星期?一

More Related Content

了解笔丑辫内核

  • 2. 我是…… Er、T0ny 中心的学生 写PHP的程序员 喜欢各种折腾 12年10月29日星期?一
  • 4. 颁代码 PHP代码 gcc -o xxx ??? $> xxx 12年10月29日星期?一
  • 6. mod_php cli cgi/fastcgi ... SAPI PHP API streams, output, etc. PHP (core) Extensions mysql , standard library, etc Zend API Zend Extension API Zend Engine 12年10月29日星期?一
  • 7. $ php test.php Call Each extension’s MINIT Request test.php Call Each extension’s RINIT Execute test.php Call Each extension’s RSHUTDOWN Finish cleaning up after test.php Call Each extension’s MSHUTDOWN Terminate php 12年10月29日星期?一
  • 9. 笔贬笔内核 <?php echo “hi”; 词法分析 ?> 语法分析 Zend Engine (执行 opCodes) hi 12年10月29日星期?一
  • 10. 词法分析 Lex/Flex/re2c 12年10月29日星期?一
  • 11. array ( array ( <?php 0 => 368, // #define T_OPEN_TAG 368 1 => '<?php', echo $hi; 2 => 1, // LINE NO ?> ), array ( 0 => 316, // #define T_ECHO 316 1 => 'echo', 2 => 2, ), array ( 0 => 371, // #define T_WHITESPACE 371 1 => ' ', 2 => 2, token_get_all ), array ( 0 => 309, // #define T_VARIABLE 309 1 => '$haha', 2 => 2, ), 4 => ';', ) @see Zend/zend_language_parser.c 12年10月29日星期?一
  • 12. <?php T_OPEN_TAG ?> T_CLOSE_TAG $var T_VARIABLE if T_IF function T_FUNCTION for T_FOR echo T_ECHO exit T_EXIT 123 tokens php5.3 12年10月29日星期?一
  • 13. 语法分析 Yacc/Bison 12年10月29日星期?一
  • 14. T_ECHO echo_expr_list ';' echo_expr_list: echo_expr_list ',' expr { ... } | expr { ... } { ... } zend_do_echo() 12年10月29日星期?一
  • 15. void zend_do_echo(const znode *arg TSRMLS_DC) { zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC); opline->opcode = ZEND_ECHO; opline->op1 = *arg; SET_UNUSED(opline->op2); } @see Zend/zend_compile.c zend_op 出场! 12年10月29日星期?一
  • 16. struct _zend_op { // 执行该opcode时调用的处理函数 opcode_handler_t handler; znode result; znode op1; znode op2; ulong extended_value; uint lineno; zend_uchar opcode; // opcode代码 }; 12年10月29日星期?一
  • 18. switch call goto switch (opcode){ switch (opcode){ case ZEND_ADD: case ZEND_ADD: break; goto zend_add: case ZEND_CALL: break; break; ... zend_add: call ZEND_ADD_HANDLER() 12年10月29日星期?一
  • 19. opcode * 25 + zend_vm_decode[op->op1.op_type] * 5 + zend_vm_decode[op->op2.op_type]; static const opcode_handler_t labels[] 3851 indexs php5.3 12年10月29日星期?一
  • 20. zend_op op_array zend_op zend_op ... 12年10月29日星期?一
  • 21. symbol_talble *active_op_array *active_symbol_talble op_array1 op_array2 ... execute_data execute_data ... 12年10月29日星期?一
  • 23. .php SAPI Compiler ? Firefox/Chrome ? Apache/Nginx ? 词法分析 ? Console ? CLI ? 语法分析 ? Embed Executor OPCODES Output ? Main Script Buffer ? Switch/Call/Goto ? Function Table ?Console ? Class Table 12年10月29日星期?一
  • 25. <?php $a = 3; $b = 5; if($a = 5 || $b = 7) { $a++; $b++; } $a=? $b=? 12年10月29日星期?一
  • 26. <?php $a = 3; $b = 5; if( $a = 5 || $b = 7 $a ) { $a++; $b++; } 答案: Zend/zend_language_parser.y 12年10月29日星期?一
  • 27. 对于罢滨笔滨 www.php-internal.com 12年10月29日星期?一
  • 28. reeze er pan 12年10月29日星期?一
  • 30. 谢 谢 欢迎联系我: QQ:487223* email: er@zhangabc.com gtalk: er@zhangabc.com blog: www.zhangabc.com 12年10月29日星期?一