了解PHP内核12年10月29日星期⼀一
我是……                Er、T0ny                中心的学生                写PHP的程序员                喜欢各种折腾12年10月29日星期⼀一
PHP代码是如何被执行的?12年10月29日星期⼀一
C代码         PHP代码                gcc -o xxx    ???                 $> xxx12年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/re2c12年10月29日星期⼀一
array (                   array ( <?php               0 => 368, // #define T_OPEN_TAG 368                     1 => <?php, ...
<?php      T_OPEN_TAG   ?>       T_CLOSE_TAG                $var   T_VARIABLE    if         T_IF          function     T_F...
语法分析                Yacc/Bison12年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);      opli...
struct _zend_op {       // 执行该opcode时调用的处理函数       opcode_handler_t handler;       znode result;       znode op1;       zn...
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];          static con...
zend_op                op_array   zend_op                           zend_op                            ...12年10月29日星期⼀一
symbol_talble                *active_op_array       *active_symbol_talble                op_array1           op_array2    ...
让我们再来⼀一次……12年10月29日星期⼀一
.php           SAPI             Compiler       • Firefox/Chrome   • Apache/Nginx       • 词法分析       • Console          • C...
Finally……12年10月29日星期⼀一
<?php                	$a = 3;                	$b = 5;                	if($a = 5 || $b = 7) {                	        $a++;...
<?php                	$a = 3;                	$b = 5;                	if( $a = 5 || $b = 7                     $a         ...
关于TIPI                www.php-internal.com12年10月29日星期⼀一
reeze   er                        pan12年10月29日星期⼀一
Q&A12年10月29日星期⼀一
谢 谢                欢迎联系我:                QQ:487223*                email: er@zhangabc.com                gtalk: er@zhangab...
Upcoming SlideShare
Loading in...5
×

了解Php内核

1,598

Published on

0 Comments
17 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,598
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
67
Comments
0
Likes
17
Embeds 0
No embeds

No notes for slide

Transcript of "了解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 ??? $> xxx12年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 Engine12年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 php12年10月29日星期⼀一
  8. 8. PHP脚本的执行12年10月29日星期⼀一
  9. 9. PHP内核 <?php echo “hi”; 词法分析 ?> 语法分析 Zend Engine (执行 opCodes) hi12年10月29日星期⼀一
  10. 10. 词法分析 Lex/Flex/re2c12年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.c12年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.312年10月29日星期⼀一
  13. 13. 语法分析 Yacc/Bison12年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.312年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 Table12年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.y12年10月29日星期⼀一
  27. 27. 关于TIPI www.php-internal.com12年10月29日星期⼀一
  28. 28. reeze er pan12年10月29日星期⼀一
  29. 29. Q&A12年10月29日星期⼀一
  30. 30. 谢 谢 欢迎联系我: QQ:487223* email: er@zhangabc.com gtalk: er@zhangabc.com blog: www.zhangabc.com12年10月29日星期⼀一
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×