PHP是解释型语言,其执行过程需先编译成中间代码,再经由特定的虚拟机,翻译成特定的指令被执行。
PHP代码=> Token =>抽象语法树=>
Opcodes =>执行
各个步骤内容如下:
源代码通过词法分析得到Token
Token是PHP代码被切割成的有意义的标识。PHP7一共有137种Token,在zend_language_parser.h文件中做了定义。
基于语法分析器将Token转换成抽象语法树(AST)
Token就是一个个的词块,但是单独的词块不能表达完整的语义,还需要借助一定的规则进行组织串联。所以就需要语法分析器根据语法匹配Token,将Token进行串联。语法分析器串联完Token后的产物就是抽象语法树(AST,Abstract Syntax Tree)。
AST是PHP7版本的新特性,之前版本的PHP代码的执行过程中是没有生成AST这一步的。它的作用主要是实现了PHP编译器和解释器的解耦,提升了可维护性。
将语法树转换成Opcode
需要将语法树转换成Opcode,才能被引擎直接执行。
执行Opcodes
opcodes是opcode的集合形式,是PHP执行过程中的中间代码。PHP工程优化措施中有一个比较常见的“开启opcache”,指的技术这里将opcodes进行缓存。通过省去从源码到opcode的阶段,引擎直接执行缓存好的opacode,以提升性能。
PHP7内核架构
zend引擎
词法/语法分析、AST编译和opcodes的执行均在Zend引擎中实现。此外,PHP的变量设计、内存管理、进程管理等也在引擎层实现。
PHP层
zend引擎为PHP提供基础能力,而来自外部的交互则需要通过PHP层来处理。
SAPI
server API的缩写,其中包含了场景的cli SAPI和fpm SAPI。只要遵守定义好的SAPI协议,外部模块便可与PHP完成交互。
扩展部分
依据zend引擎提供的核心能力和接口规范,可以进行开发扩展。
PHP 7源码结构
php 7的源码主要目录有:sapi、Zend、main、ext和TSRM这几个。
sapi目录
sapi目录是对输入和输出层的抽象,是PHP提供对外服务的规范。
几种常用的SAPI:
1)apache2handler: Apache扩展,编译后生成动态链接库,配置到Apache下。当有http请求到Apache时,根据配置会调用此动态链接库来执行PHP代码,完成与PHP的交互。
2)cgi-fcgi:编译后生成支持CGI协议的可执行程序,webserver(如NGINX)通过CGI协议把请求传给CGI进程,CGI进程根据请求执行相应代码后将执行结果返回给webserver。
3)fpm-fcgi: fpm是FastCGI进程管理器。以NGINX服务器为例,当有请求发送到NGINX服务器,NGINX按照FastCGI协议把请求交给php-fpm进程处理。
4)cli: PHP的命令行交互接口
Zend目录
Zend目录是PHP的核心代码。PHP中的内存管理,垃圾回收、进程管理、变量、数组实现等均在该目录的源码里。
main目录
main目录是SAPI层和Zend层的黏合剂。Zend层实现了PHP脚本的编译和执行,sapi层实现了输入和输出的抽象,main目录则在它们中间起着承上启下的作用。承上,解析SAPI的请求,分析要执行的脚本文件和参数;启下,调用zend引擎之前,完成必要的模块初始化等工作。
ext目录
ext是PHP扩展相关的目录,常用的array、str、pdo等系列函数都在这里定义。
TSRM
TSRM(Thread Safe Resource Manager)——线程安全资源管理器,是用来保证资源共享的安全。
参考资料
《PHP7底层设计与源码实现》
合肥达内PHP培训“互联网大牛”软件工程师课程为有志成为互联网软件“行业新贵”的学员精心打造,从第一天起就力求知识的“新”和“深”。不但及时更新互联网知识(如:Yii框架、HTML5、NoSQL、Bootstrap、LessCSS、Minify等),同时对基础知识要达到足够的深度(如:PHP核心函数库行业内全,MySQL行业内内容深入)。
每年有10W人选择达内,选择的人多,自然是好培训!我们的课程专为零基础打造,是学PHP必经之路!如果你想在2018年成为一名高薪PHP工程师,那就从参加合肥达内免费训练营开始吧!在线留言客服可免费试听,试听过后,学不学,你说了算。
*版权声明:转载文章和图片均来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜。
填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费!怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!