当前位置: 首页 > 后端技术 > PHP

PHP7底层运行机制

时间:2023-03-29 17:29:29 PHP

PHP7代码执行过程PHP是一种解释型语言,其执行过程需要编译成中间代码,再翻译成具体的指令,通过特定的虚拟机执行。执行过程如下:PHPcode=>Token=>Abstractsyntaxnumber=>Opcodes=>上面的过程执行如下:源代码通过词法分析得到TokenToken是PHP代码切分的有意义的标识进入。PHP7一共有137个Token,定义在zend_language_parser.h文件中。基于语法分析器将标记转换为抽象语法树(AST)。Token是词法块,但是单个的词法块不能表达完整的语义,需要用一定的规则来组织和连接它们。因此,需要解析器根据语法匹配标记并连接标记。语法分析器将token拼接后的产物就是抽象语法树(AST,AbstractSyntaxTree)。AST是PHP7版本的新特性。之前版本的PHP代码在执行过程中并没有生成AST。其作用主要是实现PHP编译器和解释器的解耦,提高可维护性。将语法树转化为Opcode需要将语法树转化为Opcode后才能被引擎直接执行。ExecutingOpcodesopcodes是操作码的集合,是PHP执行过程中的中间代码。在PHP工程优化措施中,有一个比较常见的“openopcache”,这里指的是缓存opcodes的技术。通过取消从源代码到操作码的阶段,引擎直接执行缓存的操作码以提高性能。PHP7核心架构zend引擎词法/语法分析、AST编译和操作码执行都在Zend引擎中实现。此外,PHP变量设计、内存管理、进程管理等也在引擎层实现。PHP层zend引擎为PHP提供基础能力,而对外的交互则需要通过PHP层来处理。SAPIserverAPI的缩写,包含场景的cliSAPI和fpmSAPI。外部模块只要遵循定义的SAPI协议就可以与PHP进行交互。扩展部分可以根据zend引擎提供的核心能力和接口规范进行开发和扩展。PHP7源码结构php7的主要源码目录有:sapi、Zend、main、ext和TSRM。sapi目录sapi目录是对输入层和输出层的抽象,是PHP对外提供服务的规范。几个常用的SAPI:1)apache2handler:Apache扩展,编译生成动态链接库,配置在Apache下。当有http请求到Apache时,根据配置,会调用这个动态链接库来执行PHP代码,完成与PHP的交互。2)cgi-fcgi:编译后生成支持CGI协议的可执行程序。Web服务器(如NGINX)通过CGI协议将请求传递给CGI进程。CGI进程根据请求执行相应的代码,并将执行结果返回给webserver。3)fpm-fcgi:fpm是FastCGI进程管理器。以NGINX服务器为例,当向NGINX服务器发送请求时,NGINX根据FastCGI协议将请求传递给php-fpm进程。4)cli:PHP的命令行交互界面Zend目录Zend目录是PHP的核心代码。PHP中的内存管理、垃圾回收、进程管理、变量、数组实现等都在该目录的源码中。主目录主目录是SAPI层和Zend层之间的粘合剂。Zend层实现PHP脚本的编译和执行,sapi层实现输入输出的抽象,主目录作为它们之间的纽带。从上面分析SAPI请求,分析出要执行的脚本文件和参数;接下来,在调用zend引擎之前完成必要的模块初始化等工作。ext目录ext是PHP扩展相关的目录,定义了array、str、pdo等常用函数。TSRMTSRM(ThreadSafeResourceManager)——线程安全资源管理器,用于保证资源共享的安全。更多好文参考《PHP7 底层设计与源码解析》,关注公众号获取