PHP代码执行过程

943 阅读3分钟

PHP执行过程有:Scanning(Lexing) - Compilation - Execution - Parsing

1,Scanning(Lexing) ,将PHP代码转换为语言片段(Tokens)

2,Parsing, 将Tokens转换成简单而有意义的表达式

3,Compilation, 将表达式编译成Opocdes

4,Execution, 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能

PHP运行原理和机制

PHP 的设计理念及特点

PHP 被设计为一种适用于 Web 开发的动态脚本语言,底层完全由C语言实现,它具备以下特点。

解释型:程序一行一行的边解释边运行; 弱类型:和 C/C++、JAVA、C# 等语言不同,PHP 是一种弱类型的语言。定义 PHP 变量时不用指明它的类型,它的类型根据赋值的数据自动调整;另外,一个变量的类型也不是一成不变的,在运行过程中可以给变量赋值不同类型的数据,从而修改变量的类型。这种机制的灵活性在 Web 开发中非常方便和高效;

多进程模型:由于 PHP 是多进程模型,不同请求间互不干涉,这样保证了一个请求挂掉不会对全盘服务造成影响;当然,随着时代发展,PHP 也已经支持了多线程模型;

使用引擎(Zend) + 组件(ext)的模式降低内部耦合; 中间层(sapi)隔绝 web server 和 PHP。

PHP 的四层体系

image.png

  1. Zend 引擎(核心) Zend 引擎整体用C语言实现,是 PHP 的内核部分,它负责将 PHP 代码翻译(词法、语法解析等一系列编译过程)为可执行的 opcode 操作码,并实现相应的处理方法、基本的数据结构(如 hashtable、oo)、内存分配及管理、提供相应的 API 方法供外部调用。

Zend 是一切的核心,所有的外围功能均围绕 Zend 实现。 2) Extensions(扩展) 围绕着 Zend 引擎,Extensions 通过组件化的方式提供各种基础服务,我们常见的各种内置函数(例如变量操作函数、字符串操作函数等)以及标准库等都是通过 Extensions 来实现。

用户也可以根据需要实现自己的 Extension 组件以达到功能扩展、性能优化等目的,这就是高手常说的“编写 PHP 扩展”。 3) SAPI(服务器应用程序编程接口) SAPI 全称是 Server Application Programming Interface,译为“服务器应用程序编程接口”。

SAPI 通过一系列钩子函数,使得 PHP 可以和外围交互数据,这是 PHP 非常优雅和成功的一个设计,通过 SAPI 成功的将 PHP 本身和上层应用解耦隔离,PHP 可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。

  1. Application(上层应用) 这就是我们平时编写的 PHP 程序,通过不同的 SAPI 方式得到各种各样的应用模式,例如通过 Web 服务器实现网站后台、在命令行下以脚本方式运行等。

总结 如果将 PHP 看作一辆汽车,那么车的框架就是 PHP 本身,Zend 是车的引擎(发动机),Ext 下面的各种组件就是车的轮子,SAPI 可以看做是公路,车可以跑在不同类型的公路上,而一次 PHP 程序的执行就是汽车真正跑在公路上。

要想让汽车跑得快,性能优异的引擎+合适的车轮+正确的跑道都是缺一不可的。