了解Php内核2. 我是……
Er、T0ny
中心的学生
写PHP的程序员
喜欢各种折腾
12年10月29日星期⼀一
4. C代码 PHP代码
gcc -o xxx ???
$> xxx
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 Engine
12年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 php
12年10月29日星期⼀一
9. PHP内核
<?php
echo “hi”; 词法分析
?>
语法分析
Zend Engine
(执行 opCodes)
hi
12年10月29日星期⼀一
10. 词法分析
Lex/Flex/re2c
12年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.c
12年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.3
12年10月29日星期⼀一
13. 语法分析
Yacc/Bison
12年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日星期⼀一
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.3
12年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日星期⼀一
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日星期⼀一
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.y
12年10月29日星期⼀一
27. 关于TIPI
www.php-internal.com
12年10月29日星期⼀一
28. reeze er
pan
12年10月29日星期⼀一
30. 谢 谢
欢迎联系我:
QQ:487223*
email: er@zhangabc.com
gtalk: er@zhangabc.com
blog: www.zhangabc.com
12年10月29日星期⼀一