PHP的底层原理

PHP文件的执行过程

先从一个简单的php文件开始,通过php文件的编译过程来引入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) "
    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的过程如下

image.png

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.png
zend 引擎

C写的。用来实现上面的PHP语言编译

Extensions

围绕zend引擎,实现各种拓展

Sapi

apache2handler:这是以apache作为webserver,采用mod_PHP模式运行时候的处理方式,也是现在应用最广泛的一种。
cgi:这是webserver和PHP直接的另一种交互方式,也就是大名鼎鼎的fastcgi协议,在最近今年fastcgi+PHP得到越来越多的应用,也是异步webserver所唯一支持的方式。
cli:命令行调用的应用模式

你可能感兴趣的:(PHP的底层原理)