• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • php 执行过程

    PHP 从功能上来分:我们可以分为三部分:

    • 解释器部分(Zend 引擎),负责对输入代码的分析、翻译和执行。
    • 功能性部分(PHP 功能函数以及扩展),负责具体实现语言的各种功能(比如它的函数等等)。
    • 接口部分(SAPI),负责同 WEB 服务器的会话等功能。

    Zend 包括了第一部分的全部和第二部分的局部,PHP 内核包括了第二部分的局部和第三部分的全部。他们合起来称之为 PHP 包。Zend 构成了语言的核心,同时也包含了一些最基本的 PHP 预定义函数的实现。PHP 包(内核)则包含了所有创造出语言本身各种显著特性的模块。


    PHP 从内容模块上来分:我们可以分为四层体系结构:

    • Zend 引擎:Zend 整体用纯 c 语言实现,是 php 的内核部分,它将 php 代码翻译(词法、语法解析等一系列编译过程)为可执行 opcode 的处理并实现相应的处理方法、实现了基本的数据结构(如 hashtable、oo)、内存分配及管理、提供了相应的 api 方法供外部调用,是一切的核心,所有的外围功能均围绕 zend 实现。
    • Extensions 扩展:围绕着 zend 引擎,extensions 通过组件式的方式提供各种基础服务,我们常见的各种内置函数(如 array 系列)、标准库等都是通过 extension 来实现,用户也可以根据需要实现自己的 extension 以达到功能扩展、性能优化等目的(如贴吧正在使用的 php 中间层、富文本解析就是 extension 的典型应用)。
    • Sapi :是服务端应用编程接口,sapi 通过一系列钩子函数,使得 php 可以和外围交互数据,这是 php 非常优雅和成功的一个设计,通过 sapi 成功的将 php 本身和上层应用解耦隔离,php 可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。
    • 上层应用:这就是我们平时编写的 php 程序,通过不同的 sapi 方式得到各种各样的应用模式,如通过webserver 实现 web 应用、在命令行下以脚本方式运行等等。

    php结构

    其架构思想:引擎(Zend)+扩展(ext)的模式:降低内部耦合中间层(sapi):web server和php的通信接口,隔绝web server和php。如果php是一辆车,那么车的框架就是php本身,即是我们外面看到一套完整系统。 Zend是车的引擎(发动机) Ext下面的各种组件就是车的轮子 Sapi可以看做是公路,车可以跑在不同类型的公路上而一次php程序的执行就是汽车跑在公路上。因此,我们需要:性能优异的引擎+合适的车轮+正确的跑道


    php 脚本的执行

    SAPI处于 PHP 架构的上层,而真正的脚本执行是有 Zend 引擎来完成。当一个 PHP 脚本被执行的时候,首先 PHP 源代码由 Zend 引擎编译成名为 Zend opcodes 机器代码。这些代码保存在 RAM 中。然后执行 opcodes 运行真正的脚本。

    我们来看PHP脚本是怎么被执行的。如 hello.php:

    <?php
    $str = "Hello world!\n";
    echo $str;
    

    命令行执行:php hello.php输出结果显然是:Hello world!

    程序的执行:

    1、传递给 php 程序需要的执行文件 hello.php,php 程序完成基本的准备工作后启动 PHP 及 Zend 引擎,加载注册的扩展模块。

    2、初始化完后读取脚本文件,Zend 引擎对脚本进行此词法分析,语法分析,然后有 Zend 引擎编译成 opcode 码,最后执行 opcode 码。

    php 实现了一个典型的动态语言执行过程:拿到一段代码后,经过词法解析、语法解析等阶段后,源程序会被翻译成一个个指令(opcodes),然后 zend 虚拟机顺次执行这些指令完成操作。PHP 本身是用 c 语言实现的,因此最终调用的也都是 c 函数,实际上,我们可以把 php 看做是一个 c 开发的软件。通过上面描述不难看出,php 的执行的核心是翻译出来的一条一条指令,也即 opcode。


    词法分析和语法分析

    解释器一般包括两部分: 1)、读取源程序,并处理语言结构 2)、处于语言结构并生成目标程序而Lex和Yacc可以解决第一个问题。很多编程都有 Lex/Yacc 作为语言的词法语法分析生成器,比如 PHP、Python、Ruby 已经 MySql 的 sql 语言。 Lex 生成词法分析器。 Yacc 语法分析生成器。


    opcode

    PHP 构建在 Zend 虚拟机(Zend VM)之上的,PHP 的 opcode 就是 ZEND 虚拟机中的指令,即 Opcode 是 php 程序执行的最基本单位。