PHP文件的执行过程
先从一个简单的php文件开始,通过php文件的编译过程来引入php的底层
<?php
$phpCode = '<?php echo "The bottom of PHP";?>';
$tokens = token_get_all($phpCode);
foreach($tokens as $key => $val){
$tokens[$key][0] = token_name($val[0]);
}
var_dump($tokens);
执行结果如下:
array(6) {
[0]=>
array(3) {
[0]=>
string(10) "T_OPEN_TAG"
[1]=>
string(6) "<?php "
[2]=>
int(1)
}
[1]=>
array(3) {
[0]=>
string(6) "T_ECHO"
[1]=>
string(4) "echo"
[2]=>
int(1)
}
[2]=>
array(3) {
[0]=>
string(12) "T_WHITESPACE"
[1]=>
string(1) " "
[2]=>
int(1)
}
[3]=>
array(3) {
[0]=>
string(26) "T_CONSTANT_ENCAPSED_STRING"
[1]=>
string(19) ""The bottom of PHP""
[2]=>
int(1)
}
[4]=>
string(1) ";"
[5]=>
array(3) {
[0]=>
string(11) "T_CLOSE_TAG"
[1]=>
string(2) "?>"
[2]=>
int(1)
}
}
编译程序是将高级语言变成计算机可识别的二进制语言。主要分为五个过程
词法分析->语法分析->语义检查和中间代码生成->代码优化->目标代码生成
对应的PHP的过程如下
opcode的数据结构如下
struct _zend_op {
opcode_handler_t handler; //执行时调用的处理函数
znode_op op1; //操作数1
znode_op op2; //操作数2
znode_op result; //结果
ulong extended_value; //额外的信息
uint lineno; //源码中的行数
zend_uchar opcode; //opcode代码
zend_uchar op1_type; //操作数1类型
zend_uchar op2_type; //操作数1类型
zend_uchar result_type; //结果类型
};
PHP四层体系
image.pngzend 引擎
C写的。用来实现上面的PHP语言编译
Extensions
围绕zend引擎,实现各种拓展
Sapi
apache2handler:这是以apache作为webserver,采用mod_PHP模式运行时候的处理方式,也是现在应用最广泛的一种。
cgi:这是webserver和PHP直接的另一种交互方式,也就是大名鼎鼎的fastcgi协议,在最近今年fastcgi+PHP得到越来越多的应用,也是异步webserver所唯一支持的方式。
cli:命令行调用的应用模式
网友评论