Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
了解PHP内核
12年10月29日星期⼀一
我是……
                Er、T0ny
                中心的学生
                写PHP的程序员
                喜欢各种折腾



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




12年10月29日星期⼀一
C代码         PHP代码

                gcc -o xxx    ???


                 $> xxx

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




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

                                                                       SAPI



  ...
$ php test.php

                           Call Each extension’s MINIT

                                 Request test.php
...
PHP脚本的执行




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


                       Zend Engine
...
词法分析
                Lex/Flex/re2c



12年10月29日星期⼀一
array (
                   array (
 <?php               0 => 368, // #define T_OPEN_TAG 368
                     1 => '<?p...
<?php      T_OPEN_TAG   ?>       T_CLOSE_TAG




                $var   T_VARIABLE    if         T_IF




          functi...
语法分析
                Yacc/Bison



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



       echo_expr_list:
              echo_expr_list ',' expr { ... }
          |   expr      ...
void zend_do_echo(const znode *arg TSRMLS_DC)
 {
    zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);

      ...
struct _zend_op {
       // 执行该opcode时调用的处理函数
       opcode_handler_t handler;
       znode result;
       znode op1;
    ...
opcodes的执行




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


    switch (opcode){                    switch (opcode){
     case ZEND_ADD:      ...
opcode * 25
          + zend_vm_decode[op->op1.op_type] * 5
          + zend_vm_decode[op->op2.op_type];



          stat...
zend_op



                op_array   zend_op



                           zend_op


                            ...



1...
symbol_talble

                *active_op_array       *active_symbol_talble


                op_array1           op_array...
让我们再来⼀一次……




12年10月29日星期⼀一
.php           SAPI             Compiler
       • Firefox/Chrome   • Apache/Nginx       • 词法分析
       • Console          •...
Finally……




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

                	if($a = 5 || $b = 7) {
                	        ...
<?php
                	$a = 3;
                	$b = 5;

                	if( $a = 5 || $b = 7
                     $a    ...
关于TIPI


                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...
Prochain SlideShare
Chargement dans…5
×

sur

了解Php内核 Slide 1 了解Php内核 Slide 2 了解Php内核 Slide 3 了解Php内核 Slide 4 了解Php内核 Slide 5 了解Php内核 Slide 6 了解Php内核 Slide 7 了解Php内核 Slide 8 了解Php内核 Slide 9 了解Php内核 Slide 10 了解Php内核 Slide 11 了解Php内核 Slide 12 了解Php内核 Slide 13 了解Php内核 Slide 14 了解Php内核 Slide 15 了解Php内核 Slide 16 了解Php内核 Slide 17 了解Php内核 Slide 18 了解Php内核 Slide 19 了解Php内核 Slide 20 了解Php内核 Slide 21 了解Php内核 Slide 22 了解Php内核 Slide 23 了解Php内核 Slide 24 了解Php内核 Slide 25 了解Php内核 Slide 26 了解Php内核 Slide 27 了解Php内核 Slide 28 了解Php内核 Slide 29 了解Php内核 Slide 30
Prochain SlideShare
What is this DI and AOP stuff anyway...
Suivant
Télécharger pour lire hors ligne et voir en mode plein écran

20 j’aime

Partager

Télécharger pour lire hors ligne

了解Php内核

Télécharger pour lire hors ligne

了解Php内核

  1. 1. 了解PHP内核 12年10月29日星期⼀一
  2. 2. 我是…… Er、T0ny 中心的学生 写PHP的程序员 喜欢各种折腾 12年10月29日星期⼀一
  3. 3. PHP代码是如何被执行的? 12年10月29日星期⼀一
  4. 4. C代码 PHP代码 gcc -o xxx ??? $> xxx 12年10月29日星期⼀一
  5. 5. PHP的生命周期 12年10月29日星期⼀一
  6. 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. 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日星期⼀一
  8. 8. PHP脚本的执行 12年10月29日星期⼀一
  9. 9. PHP内核 <?php echo “hi”; 词法分析 ?> 语法分析 Zend Engine (执行 opCodes) hi 12年10月29日星期⼀一
  10. 10. 词法分析 Lex/Flex/re2c 12年10月29日星期⼀一
  11. 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. 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. 13. 语法分析 Yacc/Bison 12年10月29日星期⼀一
  14. 14. T_ECHO echo_expr_list ';' echo_expr_list: echo_expr_list ',' expr { ... } | expr { ... } { ... } zend_do_echo() 12年10月29日星期⼀一
  15. 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. 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日星期⼀一
  17. 17. opcodes的执行 12年10月29日星期⼀一
  18. 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. 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. 20. zend_op op_array zend_op zend_op ... 12年10月29日星期⼀一
  21. 21. symbol_talble *active_op_array *active_symbol_talble op_array1 op_array2 ... execute_data execute_data ... 12年10月29日星期⼀一
  22. 22. 让我们再来⼀一次…… 12年10月29日星期⼀一
  23. 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日星期⼀一
  24. 24. Finally…… 12年10月29日星期⼀一
  25. 25. <?php $a = 3; $b = 5; if($a = 5 || $b = 7) { $a++; $b++; } $a=? $b=? 12年10月29日星期⼀一
  26. 26. <?php $a = 3; $b = 5; if( $a = 5 || $b = 7 $a ) { $a++; $b++; } 答案: Zend/zend_language_parser.y 12年10月29日星期⼀一
  27. 27. 关于TIPI www.php-internal.com 12年10月29日星期⼀一
  28. 28. reeze er pan 12年10月29日星期⼀一
  29. 29. Q&A 12年10月29日星期⼀一
  30. 30. 谢 谢 欢迎联系我: QQ:487223* email: er@zhangabc.com gtalk: er@zhangabc.com blog: www.zhangabc.com 12年10月29日星期⼀一
  • YawenWu8

    Jun. 1, 2018
  • TongWang9

    Jun. 23, 2017
  • ywdblog

    Sep. 12, 2015
  • crazyalasha

    Jun. 24, 2015
  • HikoQ

    Jan. 9, 2014
  • huanggy001

    Dec. 17, 2013
  • LeoTeng

    Dec. 6, 2013
  • RenHuangHuang

    Aug. 15, 2013
  • iambigd

    Mar. 20, 2013
  • evilfate

    Mar. 13, 2013
  • c1n

    Feb. 24, 2013
  • asika32764

    Feb. 23, 2013
  • stevechiang5

    Jan. 2, 2013
  • zx1986

    Dec. 30, 2012
  • JoeHorn

    Dec. 12, 2012
  • shimehsu

    Dec. 4, 2012
  • gasolwu

    Dec. 4, 2012
  • appleboy

    Dec. 4, 2012
  • johnroyer

    Dec. 4, 2012
  • deva.lin

    Dec. 3, 2012

Vues

Nombre de vues

2 295

Sur Slideshare

0

À partir des intégrations

0

Nombre d'intégrations

47

Actions

Téléchargements

71

Partages

0

Commentaires

0

Mentions J'aime

20

×