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

PHP程序员应该了解PHP7代码的执行过程

时间:2023-03-30 00:42:43 PHP

PHP是一种解释型语言,它的执行过程需要先编译成中间代码,再翻译成具体的指令,通过特定的虚拟机执行。执行过程如下:PHPcode=>Token=>AbstractSyntaxTree=>Opcodes=>每一步内容如下:通过词法分析得到源代码。TokenToken是PHP代码切入的一个有意义的标识。PHP7一共有137个Token,定义在zend_language_parser.h文件中。基于语法分析器将标记转换为抽象语法树(AST)。Token是词法块,但是单个的词法块不能表达完整的语义,需要用一定的规则来组织和连接它们。所以需要语法分析器根据文法匹配Token,并拼接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 底层设计与源码实现》看到这里,想必很多PHPer都想到了进阶PHP前辈和架构师来提升自己,增值加薪吧!深入学习Swoole、laravel源码、TP6、并发编程、Swoft微服务、性能优化、高并发等技术,我在这里准备了一份PHP架构师学习心得和完整的架构体系教程,请点这里