美文网首页
《编程原理系列》01 - PHP执行原理

《编程原理系列》01 - PHP执行原理

作者: 聂云⻜ | 来源:发表于2020-01-03 23:28 被阅读0次

    PHP的执行原理是面试过程中经常会问到的考点之一,本篇主要是对此类问题做一汇总,持续更新。

    抛开面试,了解PHP底层实现的目的是什么?动态语言要像用好首先得了解它,内存管理、框架模型值得我们借鉴,通过扩展开发实现更多更强大的功能,优化我们程序的性能。

    PHP本身是用C实现的,因此最终调用的也是C的函数,实际上,我们可以把PHP看做一个C开发的软件。

    一、PHP的设计理念及特点

    1、多进程模型:由于PHP是多进程模型,不同请求间互不干涉,这样保证了一个请求挂掉不会对全盘服务造成影响。目前PHP也支持多线程模型。

    2、弱类型语言:和C/C++、JAVA、C#等语言不同,PHP是一种弱类型的语言。一个变量的类型并不是一开始就确定不变的,运行中才会确定并可能发生隐式或显示的类型转换,这种机制的灵活性在web开发中非常方便、高效。

    3、引擎(Zend)+ 组件(ext)的模式降低内部耦合。

    4、中间层(sapi )隔绝web server和PHP。

    5、语法简单灵活,没有太多规范。但缺点可能导致风格混杂。

    二、PHP的四层体系

    从图上可以看出,PHP从下到上是一个4层体系:

    1、Zend引擎:Zend整体用纯C实现,是PHP的内核部分,他将PHP代码翻译(词法、语法解析等一系列编译过程)为可执行的opcode,处理并实现相应的处理方法、实现了基本的数据结构(如:hashtable、OO)、内存分配机制及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕Zend实现。

    2、Extensions:围绕着Zend引擎,extensions通过组件式的方式提供各种基础服务,我们常见的各种内置函数(array系列)、标准库等都是通过extension来实现,用户也可以根据需要实现自己的extension的典型应用。

    3、Sapi:Sapi全称Server Application Programming Interface,也就是服务端应用编程接口,Sapi通过一系列钩子函数,使得PHP可以和外围交互数据,这是PHP非常优雅和成功的设计。通过sapi成功的将PHP本身和上层应用解耦隔离,PHP可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。

    4、上层应用:这就是我们平时编写的PHP程序,通过不同的spai方式得到各种各样的应用模式,如何通过webserver实现web应用、在命令行下已脚本方式运行等等。

    我们需要:性能优异的引擎(Zend)+合适的车轮(Ext)+正确的跑道(Sapi)

    三、 Sapi相关

    如前所述,Sapi通过通过一系列的接口,使得外部应用可以和PHP交换数据并可以根据不同应用特点实现特定的处理方法,我们常见的一些sapi有:

    apache2handler:这是以apache作为webserver,采用mod_PHP模式运行时候的处理方式,也是现在应用最广泛的一种。

    cgi:这是webserver和PHP直接的另一种交互方式,也就是大名鼎鼎的fastcgi协议,在最近今年fastcgi+PHP得到越来越多的应用,也是异步webserver所唯一支持的方式。

    cli:命令行调用的应用模式

    四、PHP执行流程 & opcode

    PHP动态语言执行过程:拿到一段代码后,经过词法解析、语法解析等阶段后,源程序会被翻译成一个个指令(opcodes),然后ZEND虚拟机顺次执行这些指令完成操作。

    PHP的执行的核心是翻译出来的一条一条指令,也是opcode,Opcode是PHP程序执行的最基本单位。

    在计算机科学领域中,操作码(Operation Code, OPCode)被用于描述机器语言指令中,指定要执行某种操作的那部分机器码,构成OPCode的指令格式和规范由处理器的指令规范指定。

    一个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

    PHP本身不支持缓存opcode,但是apc,apxu, xcache等加速器,实现了这样的效果。

    相关文章

      网友评论

          本文标题:《编程原理系列》01 - PHP执行原理

          本文链接:https://www.haomeiwen.com/subject/cratactx.html