PHP架构与工作方式初探

以主流PHP版本(PHP7,PHP5)来说PHP架构主要由四层体系构成,从下到上依次是Zend引擎,Extensions拓展,SAPI接口和Application上层应用
Zend引擎
Zend 引擎是 PHP4 以后加入 PHP 的,是对原有PHP解释器的重写,整体使用 C 语言进行开发,也就是说可以把PHP理解成用C写的一个编程语言软件,引擎的作用是将PHP代码翻译为一种叫opcode的中间语言,它类似于JAVA的ByteCode(字节码)。 引擎对PHP代码会执行四个步骤:
- 词法分析 Scanning(Lexing),将 PHP 代码转换为语言片段(Tokens)。
- 解析 Parsing, 将 Tokens 转换成简单而有意义的表达式。
- 编译 Compilation,将表达式编译成Opcode。
- 执行 Execution,顺序执行Opcode,每次一条,以实现PHP代码所表达的功能。
APC、Opchche 这些扩展可以将Opcode缓存以加速PHP应用的运行速度,使用它们就可以在请求再次来临时省略前三步。
引擎也实现了基本的数据结构(如hashtable、oo)、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕Zend实现。
Extensions 扩展
围绕着 Zend 引擎,extensions 通过组件式的方式提供各种基础服务,我们常见的各种内置函数(如array系列)、标准库等都是通过 extension 来实现,用户也可以根据需要实现自己的 extension 以达到功能扩展、性能优化等目的(如贴吧正在使用的PHP中间层、富文本解析就是 extension 的典型应用)
SAPI接口
SAPI 是 Server Application Programming Interface 的缩写,中文为服务端应用编程接口,它通过一系列钩子函数使得PHP可以和外围交换数据,SAPI 就是 PHP 和外部环境的代理器,它把外部环境抽象后,为内部的PHP提供一套固定的,统一的接口,使得 PHP 自身实现能够不受错综复杂的外部环境影响,保持一定的独立性。
通过 SAPI 的解耦,PHP 可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。
Application 上层应用
就是我们平时编写的 PHP 程序,通过不同的 SAPI 方式得到各种各样的应用模式,例如通过 Web 服务器实现网站后台、在命令行下以脚本方式运行等。
PHP的执行流程
- Scanning(Lexing) 讲PHP代码转换为语言片段(Tokens)
- Parsing 将Tokens转换成简单而有意义的表达式
- Compilation 讲表达式编译成Opcode
- Execution 顺次执行Opcodes,从而实现PHP脚本的功能
即,拿到一段代码后,经过词法解析、语法解析等阶段,把源程序翻译成一个个指令(opcodes),然后Zend虚拟机顺次执行这些指令完成操作。由于PHP是用C实现的,因此最终调用的也都是C的函数。
核心执行单位 Opcode
Opcode是PHP程序执行的最基本单位。一个opcode由两个参数(op1,op2)、返回值和处理函数组成。PHP程序最终被翻译为一组opcode处理函数的顺序执行。
常见的几个处理函数:
ZEND_ASSIGN_SPEC_CV_CV_HANDLER : 变量分配 ($a=$b)
ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER:函数调用
ZEND_CONCAT_SPEC_CV_CV_HANDLER:字符串拼接 $a.$b
ZEND_ADD_SPEC_CV_CONST_HANDLER: 加法运算 $a+2
ZEND_IS_EQUAL_SPEC_CV_CONST:判断相等 $a==1
ZEND_IS_IDENTICAL_SPEC_CV_CONST:判断相等 $a===1
核心数据结构 HashTable
HashTable是Zend的核心数据结构,在PHP里面几乎并用来实现所有常见功能,我们知道的PHP数组即是其典型应用,此外,在zend内部,如函数符号表、全局变量等也都是基于hash table来实现。
PHP的hash table具有如下特点:
- 支持典型的key->value查询
- 可以当做数组使用
- 添加、删除节点是 O(1) 复杂度
- key支持混合类型:同时存在关联数组合索引数组
- Value支持混合类型:array (“string”, 2332)
- 支持线性遍历:如foreach
Zend hash table实现了典型的hash表散列结构,同时通过附加一个双向链表,提供了正向、反向遍历数组的功能。其结构如下图:
作为服务器模块的PHP是如何工作的
PHP的所有应用程序都是通过WEB服务器(如IIS,Nginx或Apache)和PHP引擎程序解释执行完成的,工作过程:
当用户在浏览器地址中输入要访问的PHP页面文件名,然后触发一个web请求,并将请求传送到WEB服务器。
WEB服务器接受这个请求,并根据其后缀进行判断是一个PHP请求,WEB服务器从硬盘或内存中调出用户要访问的PHP应用程序,并将其发送给PHP引擎程序。
PHP引擎程序会执行WEB服务器传送过来的PHP代码,完成数据库交互,读取文件,进行计算等操作,并生成动态内容,包括但不限于数据库中检索的数据,引用的其他文件或资源,计算得出的结果。这些生成的动态内容回被处理为一个HTML页面。
(4)PHP引擎将生成HTML页面返回给WEB服务器。这些动态内容将与其他相关信息(如响应代码,响应头)结合,构建为HTTP响应,被WEB服务器返回给客户端浏览器。
- Title: PHP架构与工作方式初探
- Author: 7erry
- Created at : 2023-07-20 00:00:00
- Updated at : 2023-07-20 00:00:00
- Link: http://7erry.com/2023/07/20/PHP架构与工作方式初探/
- License: This work is licensed under CC BY-NC 4.0.