PHP底层的运行机制与原理

460 阅读2分钟

我们先看一下PHP核心架构图


从下到上的四层体系:

  1. Zend引擎:Zend整体用C语言实现,是PHP的内核部分。它将PHP代码翻译,实现了基本的数据结构,内存分配机制及管理,提供了相应的api供外部调用,是一切的核心。
  2. Extensions:围绕Zend引擎,extensions通过组件式的方式提供各种基础服务,我们常见的各种内置函数、标准库等都是通过 extension来实现,用户也可以根据需要实现自己的extension。
  3. Sapi:Aerver Application Programming Interface,即服务端应用编程接口,是PHP和web server的中间层。Sapi通过钩子函数,使PHP能和外部交互数据,这也将PHP和上层应用解耦
  4. 上层应用:就是我们平时编写的PHP程序,通过不同的sapi方式得到各种各样的应用模式


我们接着看一下PHP的执行流程图:




拿到一段代码后,经过词法解析、语法解析等阶段后,源程序会被翻译成一个个指令(opcode),然后ZEND虚拟机顺次执行这些指令完成操作。PHP本身是用C实现的,因此最终调用的也是C的函数,实际上,我们可以把PHP看做一个C开发的软件。简单一句话:第一步是词法分析,第二步是语法分析,第三步是转化为opcode,第四部也就是顺序执行这些opcode了。以上四部都是在ZEND引擎执行的。

这里我们再讲讲opcode和opcache,上面执行流程中他会生成opcode指令,那么opcache是什么呢?

Opcache是一种通过将解析的PHP脚本预编译的字节码(opcode)存放在共享内存中来避免每次加载和解析PHP脚本的开销,解析器可以直接从共享内存读取已经缓存的字节码(opcode),从而大大提高PHP的执行效率。目地是避免重复编译,减少CPU和内存开销

为什么要使用Opcache?

正常情况php执行就是第二张图的流程,但是每一次请求PHP脚本都会执行一遍以上步骤,如果PHP源代码没有变化,那么Opcode也不会变化,显然没有必要每次都重行生成Opcode。因此使用了Operate Code缓存之后,PHP代码会直接获取opcode后直接执行,中间的三个步骤会省略掉因此会大幅提高PHP代码执行效率


参考文章:

www.php.cn/php-weiziji…

xz.aliyun.com/t/5774

www.cnblogs.com/wanglijun/p…