u1jodi1q 发表于 2024-10-4 13:06:53

浅析 PHP7 底层运行机制


    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">微X</span>公众号:<strong style="color: blue;">PHP在线</strong></p><span style="color: black;">PHP7 代码执行过程</span>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">PHP 是解释型语言,其执行过程需先编译成中间代码,再经由特定的虚拟机,翻译成特定的指令被执行。其执行过程如下:</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">PHP&nbsp;代码&nbsp;=&gt;&nbsp;Token&nbsp;=&gt;&nbsp;抽象语法树&nbsp;=&gt;&nbsp;Opcodes&nbsp;=&gt;&nbsp;执行</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">各个<span style="color: black;">过程</span>内容如下:</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">源代码<span style="color: black;">经过</span>词法分析得到 Token</p>Token 是 PHP 代码被切割成的有<span style="color: black;">道理</span>的标识。PHP7 一共有 137 种 Token,在 zend_language_parser.h 文件中做了定义。
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">基于语法分析器将 Token 转换成抽象语法树(AST)</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">Token <span style="color: black;">便是</span>一个个的词块,<span style="color: black;">然则</span>单独的词块<span style="color: black;">不可</span>表达完整的语义,还需要借助<span style="color: black;">必定</span>的规则进行组织串联。<span style="color: black;">因此</span>就需要语法分析器<span style="color: black;">按照</span>语法匹配 Token,将 Token 进行串联。语法分析器串联完 Token 后的产物<span style="color: black;">便是</span>抽象语法树(AST,Abstract Syntax Tree)。</p>AST 是 PHP7 版本的新特性,之前版本的 PHP 代码的执行过程中是<span style="color: black;">无</span>生成 AST 这一步的。它的<span style="color: black;">功效</span><span style="color: black;">重点</span>是实现了 PHP 编译器和解释器的解耦,<span style="color: black;">提高</span>了可<span style="color: black;">守护</span>性。
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">将语法树转换成 Opcode</p>需要将语法树转换成 Opcode,<span style="color: black;">才可</span>被引擎直接执行。
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">执行 Opcodes</p>opcodes 是 opcode 的集合形式,是 PHP 执行过程中的中间代码。PHP 工程优化<span style="color: black;">办法</span>中有一个比较<span style="color: black;">平常</span>的 “开启 opcache”,指的技术<span style="color: black;">这儿</span>将 opcodes 进行缓存。<span style="color: black;">经过</span>省去从源码到 opcode 的<span style="color: black;">周期</span>,引擎直接执行缓存好的 opacode,以<span style="color: black;">提高</span>性能。<span style="color: black;">PHP7 内核架构</span>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_jpg/mpTpNCHRiciaicY66U6vT18wib1WMqzpAxWLl1q3MCPAljBqJOMApAUUoWR7yMd4n4Hia7ZlibLzTOshaaH5O6vsMR2g/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">要把这张图印在脑海里</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">zend 引擎</p>词法 / 语法分析、AST 编译和 opcodes 的执行均在 Zend 引擎中实现。<span style="color: black;">另外</span>,PHP 的变量设计、内存管理、进程管理等<span style="color: black;">亦</span>在引擎层实现。
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">PHP 层</p>zend 引擎为 PHP <span style="color: black;">供给</span><span style="color: black;">基本</span>能力,而来自<span style="color: black;">外边</span>的交互则需要<span style="color: black;">经过</span> PHP 层来处理。
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">SAPI</p>server API 的缩写,其中<span style="color: black;">包括</span>了场景的 cli SAPI 和 fpm SAPI。只要遵守定义好的 SAPI 协议,<span style="color: black;">外边</span>模块便可与 PHP 完成交互。
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">扩展部分</p>依据 zend 引擎<span style="color: black;">供给</span>的核心能力和接口规范,<span style="color: black;">能够</span>进行<span style="color: black;">研发</span>扩展。<span style="color: black;">PHP 7 源码结构</span>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">php 7 的源码<span style="color: black;">重点</span>目录有:sapi 、Zend、main、ext 和 TSRM 这几个。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">sapi 目录</p>sapi 目录是对输入和输出层的抽象,是 PHP <span style="color: black;">供给</span>对外服务的规范。
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">几种常用的 SAPI:</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">1)apache2handler: Apache 扩展,编译后生成动态链接库,配置到 Apache 下。当有 http 请求到 Apache 时,<span style="color: black;">按照</span>配置会调用此动态链接库来执行 PHP 代码,完成与 PHP 的交互。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">2)cgi-fcgi: 编译后生成支持 CGI 协议的可执行程序,webserver(如 NGINX)<span style="color: black;">经过</span> CGI 协议把请求传给 CGI 进程,CGI 进程<span style="color: black;">按照</span>请求执行相应代码后将执行结果返回给 webserver。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">3)fpm-fcgi: fpm 是 FastCGI 进程管理器。以 NGINX 服务器为例,当有请求发送到 NGINX 服务器,NGINX <span style="color: black;">根据</span> FastCGI 协议把请求交给 php-fpm 进程处理。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">4)cli: PHP 的命令行交互接口</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">Zend 目录</p>Zend 目录是 PHP 的核心代码。PHP 中的内存管理,垃圾回收、进程管理、变量、数组实现等均在该目录的源码里。
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">main 目录</p>main 目录是 SAPI 层和 Zend 层的黏合剂。Zend 层实现了 PHP 脚本的编译和执行,sapi 层实现了输入和输出的抽象,main 目录则在它们中间起着承上启下的<span style="color: black;">功效</span>。承上,解析 SAPI 的请求,分析要执行的脚本文件和参数;启下,调用 zend 引擎之前,完成必要的模块初始化等工作。
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">ext 目录</p>ext 是 PHP 扩展<span style="color: black;">关联</span>的目录,常用的 array、str、pdo 等系列函数都在<span style="color: black;">这儿</span>定义。
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">TSRM</p>TSRM(Thread Safe Resource Manager)—— 线程安全资源管理器, 是用来<span style="color: black;">保准</span>资源共享的安全。
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">参考资料</p>《PHP7 底层设计与源码实现》
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_jpg/mpTpNCHRiciaicaDQYMQjicuJBTHZVOeRibjicoU4Yyx3tnBY2e7JNoMC3ECDW5zxTuDj0XpXSW42FJ8BNmdNOfamdnA/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>




页: [1]
查看完整版本: 浅析 PHP7 底层运行机制