php-浅谈php底层机制php
1. PHP的设计理念及特色程序员
多进程模型:因为PHP是多进程模型,不一样请求间互不干涉,这样保证了一个请求挂掉不会对全盘服务形成影响,固然,随着时代发展,PHP也早已支持多线程模型。web
弱类型语言:和C/C++、Java、C#等语言不一样,PHP是一门弱类型语言。一个变量的类型并非一开始就肯定不变,运行中才会肯定并可能发生隐式或显式的类型转换,这种机制的灵活性在web开发中很是方便、高效,具体会在后面PHP变量中详述。apache
引擎(Zend)+组件(ext)的模式下降内部耦合。编程
中间层(sapi)隔绝web server和PHP。api
语法简单灵活,没有太多规范。缺点致使风格混杂,但再差的程序员也不会写出太离谱危害全局的程序。数组
2. PHP的四层体系性能优化
PHP的核心架构以下图:数据结构
从图上能够看出,PHP从下到上是一个4层体系:多线程
Zend引擎:Zend总体用纯C实现,是PHP的内核部分,它将PHP代码翻译(词法、语法解析等一系列编译过程)为可执行opcode的处理并实现相应的处理方法、实现了基本的数据结构(如hashtable、oo)、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,全部的外围功能均围绕Zend实现。
Extensions:围绕着Zend引擎,extensions经过组件式的方式提供各类基础服务,咱们常见的各类内置函数(如array系列)、标准库等都是经过extension来实现,用户也能够根据须要实现本身的extension以达到功能扩展、性能优化等目的(如贴吧正在使用的PHP中间层、富文本解析就是extension的典型应用)。
Sapi:Sapi全称是Server Application Programming Interface,也就是服务端应用编程接口,Sapi经过一系列钩子函数,使得PHP能够和外围交互数据,这是PHP很是优雅和成功的一个设计,经过sapi成功的将PHP自己和上层应用解耦隔离,PHP能够再也不考虑如何针对不一样应用进行兼容,而应用自己也能够针对本身的特色实现不一样的处理方式。
上层应用:这就是咱们平时编写的PHP程序,经过不一样的sapi方式获得各类各样的应用模式,如经过webserver实现web应用、在命令行下以脚本方式运行等等。
若是PHP是一辆车,那么车的框架就是PHP自己,Zend是车的引擎(发动机),Ext下面的各类组件就是车的轮子,Sapi能够看作是公路,车能够跑在不一样类型的公路上,而一次PHP程序的执行就是汽车跑在公路上。所以,咱们须要:性能优异的引擎+合适的车轮+正确的跑道。
3. Sapi
如前所述,Sapi经过经过一系列的接口,使得外部应用能够和PHP交换数据并能够根据不一样应用特色实现特定的处理方法,咱们常见的一些sapi有:
apache2handler:这是以apache做为webserver,采用mod_PHP模式运行时候的处理方式,也是如今应用最普遍的一种。
cgi:这是webserver和PHP直接的另外一种交互方式,也就是大名鼎鼎的fastcgi协议,在最近今年fastcgi+PHP获得愈来愈多的应用,也是异步webserver所惟一支持的方式。
cli:命令行调用的应用模式
4. PHP的执行流程&opcode
咱们先来看看PHP代码的执行所通过的流程。
从图上能够看到,PHP实现了一个典型的动态语言执行过程:拿到一段代码后,通过词法解析、语法解析等阶段后,源程序会被翻译成一个个指令(opcodes),而后ZEND虚拟机顺次执行这些指令完成操做。PHP自己是用C实现的,所以最终调用的也都是C的函数,实际上,咱们能够把PHP看作是一个C开发的软件。
PHP的执行的核心是翻译出来的一条一条指令,也即opcode。
Opcode是PHP程序执行的最基本单位。一个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