PHP架构与工作方式初探

7erry

以主流PHP版本(PHP7,PHP5)来说PHP架构主要由四层体系构成,从下到上依次是Zend引擎,Extensions拓展,SAPI接口和Application上层应用
PHP的架构

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表散列结构,同时通过附加一个双向链表,提供了正向、反向遍历数组的功能。其结构如下图:
PHPhash表结构

作为服务器模块的PHP是如何工作的

PHP的所有应用程序都是通过WEB服务器(如IIS,Nginx或Apache)和PHP引擎程序解释执行完成的,工作过程:

  1. 当用户在浏览器地址中输入要访问的PHP页面文件名,然后触发一个web请求,并将请求传送到WEB服务器。

  2. WEB服务器接受这个请求,并根据其后缀进行判断是一个PHP请求,WEB服务器从硬盘或内存中调出用户要访问的PHP应用程序,并将其发送给PHP引擎程序。

  3. 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.