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

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

了解Php内核

1,540

Published on

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

No Downloads
Views
Total Views
1,540
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
64
Comments
0
Likes
16
Embeds 0
No embeds

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日星期⼀一

×