• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
了解Php内核
 

了解Php内核

on

  • 1,675 views

 

Statistics

Views

Total Views
1,675
Views on SlideShare
1,634
Embed Views
41

Actions

Likes
16
Downloads
55
Comments
0

1 Embed 41

http://www.plurk.com 41

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-NoDerivs LicenseCC Attribution-NoDerivs License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    了解Php内核 了解Php内核 Presentation Transcript

    • 了解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 API streams, output, etc. PHP (core) Extensions mysql , standard library, etc Zend API Zend Extension API Zend Engine12年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 php12年10月29日星期⼀一
    • PHP脚本的执行12年10月29日星期⼀一
    • PHP内核 <?php echo “hi”; 词法分析 ?> 语法分析 Zend Engine (执行 opCodes) hi12年10月29日星期⼀一
    • 词法分析 Lex/Flex/re2c12年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.c12年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.312年10月29日星期⼀一
    • 语法分析 Yacc/Bison12年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.312年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 Table12年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.y12年10月29日星期⼀一
    • 关于TIPI www.php-internal.com12年10月29日星期⼀一
    • reeze er pan12年10月29日星期⼀一
    • Q&A12年10月29日星期⼀一
    • 谢 谢 欢迎联系我: QQ:487223* email: er@zhangabc.com gtalk: er@zhangabc.com blog: www.zhangabc.com12年10月29日星期⼀一