了解Php内核
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

了解Php内核

  • 1,818 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,818
On Slideshare
1,777
From Embeds
41
Number of Embeds
1

Actions

Shares
Downloads
55
Comments
0
Likes
16

Embeds 41

http://www.plurk.com 41

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. 了解PHP内核12年10月29日星期⼀一
  • 2. 我是…… Er、T0ny 中心的学生 写PHP的程序员 喜欢各种折腾12年10月29日星期⼀一
  • 3. PHP代码是如何被执行的?12年10月29日星期⼀一
  • 4. C代码 PHP代码 gcc -o xxx ??? $> xxx12年10月29日星期⼀一
  • 5. PHP的生命周期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 Engine12年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 php12年10月29日星期⼀一
  • 8. PHP脚本的执行12年10月29日星期⼀一
  • 9. PHP内核 <?php echo “hi”; 词法分析 ?> 语法分析 Zend Engine (执行 opCodes) hi12年10月29日星期⼀一
  • 10. 词法分析 Lex/Flex/re2c12年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.c12年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.312年10月29日星期⼀一
  • 13. 语法分析 Yacc/Bison12年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日星期⼀一
  • 17. opcodes的执行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.312年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日星期⼀一
  • 22. 让我们再来⼀一次……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 Table12年10月29日星期⼀一
  • 24. Finally……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.y12年10月29日星期⼀一
  • 27. 关于TIPI www.php-internal.com12年10月29日星期⼀一
  • 28. reeze er pan12年10月29日星期⼀一
  • 29. Q&A12年10月29日星期⼀一
  • 30. 谢 谢 欢迎联系我: QQ:487223* email: er@zhangabc.com gtalk: er@zhangabc.com blog: www.zhangabc.com12年10月29日星期⼀一