PHP7源码整体框架的示例分析

介绍

这篇文章主要介绍了PHP7源码整体框架的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。

<强>一、PHP7语言执行原理

常用的高级语言有很多种,根据运行的方式不同,大体分为两种:

以C语言为代表的编译型语言,代码发生更新都要经过以上步骤。

<强>编译型语言的执行示意:

 PHP7源码整体框架的示例分析

对编译型语言与解释型语言的区别的理解,立足于源代码被编译成目标平台CPU指令的时机。对于编译型语言,编译结果已经是针对当前CPU体系的指令,而解释型语言,需要先编译成中间代码,再经由该解释型语言的特定虚拟机,翻译成特定CPU体系的指令被执行。解释型语言是在运行过程中,翻译为目标平台的指令。常说解释型语言“慢”,主要也是慢在这里。

在PHP 7中,源代码首先进行词法分析,将源代码切割为多个字符串单元,分割后的字符串称为令牌。而一个一个独立的令牌是无法表达完整语义的,需经过语法分析阶段,将牌转换为抽象语法树(简称AST)。之后,抽象语法树被转换为机器指令执行。在PHP中,这些指令称为码。

 PHP7源码整体框架的示例分析

1。令牌

标记是PHP代码被切割成的有意义的标识。PHP提供了token_get_all()函数来获取PHP代码被切割后的令牌。.

二维数组的每个成员数组的第一个值为令牌对应的枚举值。第二个值为令牌对应的原始字符串内容。第三个值为代码对应的行号。

可见,令牌就是一个个的“词块”,但是单独存在的词块不能表达完整的语义,还需要借助规则进行组织串联。语法分析器就是这个组织者。它会检查语法,匹配的令牌,令牌对进行关联。

2。AST

AST是PHP 7版本新特性。在这之前的版本中,PHP代码的执行过程中是没有生成AST这一步的。

AST的节点分为多种类型,对应着PHP语法。

PHP-Parser工具,它可以用来查看PHP代码生成的AST。

提升性能。

借助vld插件,可以直观地看到一段PHP代码生成的opcode。

opcode是PHP 7定义的一组指令标识,指令对应着相应的handler(处理函数)。当虚拟机调用opcode,会找到opcode背后的处理函数,执行真正的处理。

二、内核架构

Zend引擎中包含了编译器和解释器,从PHP代码到opcode的执行,均由Zend引擎完成。

Zend引擎除了实现了PHP的核心功能,还提供了一套接口,让PHP可以在更多的场景中使用,如命令行环境、Web环境等。

PHP7 源码整体框架的示例分析

该架构图大致分为四大部分。

sapi目录源码

sapi目录是对输入和输出层的抽象,是PHP提供对外服务的规范。

PHP程序的输入可以是来自于命令行的标准输入,也可以是来自基于cgi/fastcgi协议的网络请求。同理,输出可以写到命令行的标准输出,也可以作为基于cgi/fastcgi协议的网络响应返回给客户端。

命令行模式对应的是二进制程序bin/php;内置模块的模式不需要提供二进制程序,作为普通函数供Apache或任意C/C++程序来调用即可;CGI模式对应的是二进制程序bin/cgi;FastCGI模式对应的是二进制程序sbin/php-fpm。

几种常用的SAPI。

1)apache2handler:Apache扩展,编译后生成动态链接库,配置到Apache下,当有http请求到Apache时,根据配置会调用此动态链接库,执行PHP代码,完成与PHP的交互。

PHP7源码整体框架的示例分析