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 的四层体系
- 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 可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。
- Application(上层应用) 这就是我们平时编写的 PHP 程序,通过不同的 SAPI 方式得到各种各样的应用模式,例如通过 Web 服务器实现网站后台、在命令行下以脚本方式运行等。
总结 如果将 PHP 看作一辆汽车,那么车的框架就是 PHP 本身,Zend 是车的引擎(发动机),Ext 下面的各种组件就是车的轮子,SAPI 可以看做是公路,车可以跑在不同类型的公路上,而一次 PHP 程序的执行就是汽车真正跑在公路上。
要想让汽车跑得快,性能优异的引擎+合适的车轮+正确的跑道都是缺一不可的。