PHP的设计理念及特点
多进程模型
由于PHP是多进程模型,不同请求间互不干涉,这样保证了一个请求挂掉不会对全盘服务造成影响,当然,随着时代发展,PHP也早已支持多线程模型。
弱类型语言
和C/C++、Java、C#等语言不同,PHP是一门弱类型语言。一个变量的类型并不是一开始就确定不变,运行中才会确定并可能发生隐式或显式的类型转换,这种机制的灵活性在web开发中非常方便、高效。
引擎(Zend)+组件(ext)的模式降低内部耦合。
中间层(sapi)隔绝web server和PHP。
语法简单灵活,没有太多规范。缺点导致风格混杂,但再差的程序员也不会写出太离谱危害全局的程序。
PHP的构成
PHP源码主要目录有下列几个:
SAPI:全称是Server Application Programming Interface,也就是服务端应用编程接口,SAPI层可以适配不同的应用环境,可以认为是PHP的宿主环境。SAPI通过一系列构造函数,使得PHP可以和外围交互数据,这是PHP非常优雅和成功的一个设计,通过SAPI成功的将PHP本身和上层应用解耦隔离,PHP可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。-
常用的两个SAPI是Cli和Fpm,另外还有Embed,这三种是比较典型的SAPI,除此还有litespeed和apache2handle,除了Cli和Fpm其他都是配合其他应用使用的。
main:PHP的主要代码,主要是输入/输出、web通信,以及PHP框架的初始化操作(如FASTCGI协议的解析、扩展的加载、PHP配置解析等工作)等,位于ZendVM的上一层。
ZendVM:是一个虚拟计算机,介于PHP应用与实际计算机之间,用于解析执行PHP代码。ZendVM是PHP语言的核心部分,PHP的代码解释、执行就是由Zend完成的。Zend整体用纯C实现,它将PHP代码翻译(词法、语法解析等一系列编译过程)为可执行opcode的处理并实现相应的处理方法、实现了基本的数据结构(如hashtable、oo)、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕Zend实现。
虚拟机的特点是实现跨平台,只需要按照不同平台编译出对应的解析器就可以实现代码的跨平台执行。
ext(Extension):扩展是PHP内核提供的一套用于扩充PHP功能的一种方式,PHP社区中有丰富的扩展可供使用。围绕着Zend引擎,extensions通过组件式的方式提供各种基础服务,我们常见的各种内置函数(如array系列)、标准库等都是通过extension来实现,用户也可以根据需要实现自己的extension以达到功能扩展、性能优化等目的。
通过扩展,可以使用C/C++实现更强大的功能和更高的性能。扩展可分为PHP扩展、Zend扩展(主要应用于ZendVM)。
PHP的生命周期
从main()开始,PHP生命周期分为以下几个阶段:
- 模块初始化阶段(module startup)
- 请求初始化阶段(request startup)
- 执行脚本阶段(execute script),编译解析执行。
- 请求关闭阶段(request shutdown)
模块关闭阶段(module shutdown)
不同的SAPI的实现,各个阶段的执行情况会有一些差异。
PHP实现一个典型动态语言的执行过程:
- 拿到一段代码后,经过词法解析、语法解析等阶段后,源程序会被翻译成一个个指令(opcodes);
- ZEND虚拟机顺次执行这些指令完成操作,进行语义解析,然后通过执行引擎执行。
PHP本身是用C实现的,因此最终调用的也都是C的函数,实际上,可以把PHP看做是一个C开发的软件
参考:
- 秦朋 《PHP7内和剖析》第1.4/5节
- PHP的运行机制与原理(底层)
- PHP底层的运行机制与原理