深入解析PHP架构:上层应用、Sapi与PHP内核的协同工作机制

PHP架构

深入解析PHP架构:上层应用、Sapi与PHP内核的协同工作机制

1、上层应用程序:这就是我们平时写的PHP程序。我们可以通过不同的spai方法获取各种应用模式,如何通过webserver实现Web应用,在命令行以脚本方式运行等等。

2、Sapi:Sapi的全称是Server Application Programming Interface,即服务器应用程序编程接口。 Sapi使PHP能够通过一系列钩子函数与外围数据进行交互。这是PHP 非常优雅且成功的设计。通过sapi,PHP已经成功融入了世界。由于与上层应用解耦隔离,PHP可以不再考虑如何兼容不同的应用,应用本身也可以根据自身的特点实现不同的处理方式。

3、PHP内核:PHP内核获取服务器传递过来的环境变量信息,调用PHP函数、类和扩展模块。

4、扩展:扩展以Zend引擎为中心,以组件化的方式提供各种基础服务。我们常见的各种内置函数(数组系列)、标准库等都是通过扩展来实现的。用户也可以根据需要自己实现。扩展的典型应用)。

5. Zend引擎:编译器和执行器。 Zend完全用纯C实现,是PHP的核心部分。它将PHP代码(词法、语法分析等编译过程)翻译成可执行的操作码处理并实现相应的处理方法,实现基本数据结构(如hashtable、OO)、内存分配机制和管理,并为外部提供相应的api方法来电。它是一切的核心。所有外围功能都是围绕Zend实现的。

我们需要:一个好的引擎(Zend)+合适的轮子(Ext)+合适的履带(Sapi)。

PHP执行流程

从我们最初编写的PHP脚本->到最终脚本被执行->得到执行结果,这个过程其实可以分为以下几个阶段:

1.扫描(Lexin),将PHP代码转换为语言片段(Tokens)

Zend Engine(ZE)调用词法分析器(由Lex生成,源文件在Zend/zend_language_sanner.l),从我们要执行的PHP源文件中删除空格和注释,并将其一一划分为标记。

2.解析,将Token转换成简单有意义的表达式【抽象语法树(AST)】

3.编译,将表达式编译成Opocdes

ZE会将获得的token转发给语法分析器(由yacc生成,源文件在Zend/zend_language_parser.y),并一一生成操作码。操作码一般以op数组的形式存在,是PHP执行的中间语言。

4.执行,依次执行Opcodes,一次一个,从而实现PHP脚本的功能。

最后,ZE调用zend_executor执行op数组并输出结果。

(操作码对应一个C函数,执行一个操作码就是执行该操作码对应的C函数,并且这个C函数已经被编译成机器码)

PHP opcache JIT

源代码(人类可以理解) -> 字节码(解释器可以理解) -> 机器代码(硬件可以理解)

我们来看一下PHP的执行流程。假设有一个.php文件。不启用opacache的流程如下:

a.php->zend编译->操作码->PHP解释器->机器码

启用opacache的流程如下

a.php->查找opacache缓存,如果没有,zend编译成opcode并缓存->opacode->PHP解释器->机器码

启用jit的流程如下

a.php->编译->机器代码

从此以后,只执行机器代码,无需编译,效率大大提高。

左图是PHP8之前的Opcache流程示意图,右图是PHP8中的Opcache流程示意图。可以看出几个关键点:

Opcache会在操作码级别进行优化。例如,图中的两个操作码合并为一个。 PHP8 的 JIT 目前在 Opcache 中提供。

JIT在Opcache优化的基础上再次优化,结合Runtime信息直接生成机器码。 JIT 并不是原始 Opcache 优化的替代品,而是一种增强。

目前PHP8仅支持x86架构CPU

php的opcache和最近的php jit有什么区别?

JIT简介,PHP 8新特性

用简单的术语探索 PHP

深入理解PHP原理Opcodes

PHP底层运行机制及原理(仅供学习)

Zend 操作码是如何执行的?你想把它编译成机器代码然后执行吗?

你可能想看:
« 上一篇
下一篇 »

相关推荐

php实时推送,php实地培训

2026年10月05日

55阅读

php乱码出现问号的原因,php乱码出现问号的原因有哪些

2026年10月05日

46阅读

php一句话木马,一句话木马ctf

2026年10月05日

49阅读

php获取数组长度,php中如何获取数组的长度

2026年10月05日

51阅读

php面试题库及答案,php程序员面试真题库

2026年10月05日

49阅读

phpcontent-type修改,php源码二次修改需要多少钱

2026年10月05日

44阅读