看似简单的语言,其实精通起来也没有那么容易。下面根绝网上的讲解和自己的了解整理一下下面的内容。
我们需要知道底层原理的实现。
说到php的运行机制还是先给大家介绍PHP的模块。php总共有三个模块,内核,zend引擎,以及扩展层。
PHP内核用来处理请求,文件流,错误处理等相关操作。
zend引擎用以将源文件转换为机器语言,然后在虚拟机上运行它。
扩展层是一组函数,类库和流。
PHP使用它们来执行一些特性的操作。
比如,我们需要使用mysql扩展来链接数据库,当zend执行程序时可能会需要链接若干扩展,这是zend将控制器交给扩展,等处理特定任务后在返还。
最后,zend将程序运行结果返回给PHP内核,它在将结果传送给SAP层,最终输出到浏览器上。
我们需要知道的是PHP使用C来写的,具体的说,就是一个用C语言实现包含大量组件的软件框架。
也可以说PHP就是C语言来写的一个大型软件。
我们了解底层实现原理,可以帮助我们优化程序。了解内存管理,框架模型。
1:php的设计理念及特点
多进程模型,PHP是多进程模型,不同请求之间互不干扰,这样保证了一个请求挂掉不会对全盘服务造成影响。
php同时也支持多线程模型。
php是弱类型语言,一个变量的类型不是一开始就确定不变,而是在运行中会确定并可能发生隐式或者显式的类型转换。这种机制的灵活性在web开发中非常方便高效。
zend引擎+组件的模式降低内部耦合。
2:PHP的四层体系。
找一张网上的图片。大家可以看看情况。
zend
引擎:zend引擎使用纯C实现,是PHP的内核部分,他将PHP代码翻译(词法,语法解析等一系列过程)为可执行opcode的处理并实现相应的处理方法,实现了基本的数据结构(如hashtabel
oo)内存分配及管理,提供了响应的api方法供外部调用。是一切的核心,所有的外围功能均围绕zend引擎展开。
Extension:围绕zend引擎,extension通过组件方式提供各种基础服务,我们常见的各种内置函数如array,标准库等都是通过extension来实现,用户也可以根据需要实现自己的extendsion以达到功能扩展,性能优化等目的。
Sapi sapi全称是Server Application programming
Interface,也就是服务端应用编程接口,sapi通过一系列钩子函数,使得PHP可以和外围交互数据。这是php非常优雅和成功的一个设计。
上层应用:这就是我们平时编程php程序,通过不同的sapi方式得到各种各样的应用模式通过web服务器实现web应用。在命令行下以脚本方式运行等等。
3:sapisapi通过一系列的接口,使得外部应用可以和PHP交换数据并可以根据不同应用特点实现特定的处理方法。我们常见的sapi有
apache2handel
这是apache作为服务器。采用mod_php模式运行时候处理方式,也是现在应用最广泛的一种。
cgi 这是web服务器和php的另外一种交互方式,也就是有名的fastcgi协议。
cli 命令行调用的应用模式
4:php的执行流程 和 opcode
php代码执行所经过的流程
从图可以看出,我们看到,PHP实现了一个典型的动态语言执行过程,拿到一段
代码之后,经过词法解析。语法解析等阶段后,源程序会被翻译成一个个指令,然后zend虚拟机顺次执行这些指令完成操作。PHP本身是用C实现的,所以最终调用的也都是C的函数。
PHPcode是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
上面几个函数完全不知道什么意思。今天就先到这里了,这些东西都需要好好消化一点了。
对了C语言对我们来说实现相当重要的。有空还是好好学习一下C吧。