您的位置:首页 > 编程语言 > PHP开发

PHP学习笔记(一)——PHP的生命周期、运行机制及并发模型

2017-11-27 11:19 330 查看

常见运行模式

找了较多的资料后,得知PHP有不同的运行模式,而不同的运行模式也有着对应的优缺点。当然,现阶段我们还不需要深入研究,很多时候我们只需要知道我们环境运行的是什么模式,其对应的特点是什么就行了。以下是目前PHP常见的五种运行模式

WEB模式

CLI模式(Command Line Interface  命令行模式)

CGI模式(Common Gateway Interface 通用网关接口)

FastCGI模式

ISAPI模式

需要知道以下几点:

1、在PHP5.3以后,PHP不再有ISAPI模式。

2、要在IIS6上使用高版本PHP,必须安装FastCGI扩展

3、CLI模式下可以单独运行不做WEB使用

不管是哪一种运行模式,我们都统一称为SAPI(Server Application Programming Interface 服务器端应用编程端口),SAPI提供了一个和外部通信的接口。脚本执行的开始都是以SAPI接口实现开始的。

PHP的生命周期

PHP的基本生命周期可以概括为以下五个步骤:

1、SAPI启动,初始化模块(MINIT)

2、请求处理初始化(RINIT)

3、执行PHP代码

4、关闭请求(RSHUEDOWN)

5、SAPI关闭,关闭模块(MSHUTDOWN)

在模块初始化(MINIT)的阶段,PHP开始初始化其内核子系统,加载每个扩展模块,调用模块初始化例程(MINIT),使每个扩展可以初始化内部变量、分配资源、注册资源处理器,向ZEND虚拟机注册函数等。

到了请求初始化阶段,PHP会在ZEND虚拟机建立PHP脚本的运行环境,调用每个扩展的请求初始化函数(RINIT),设定特定的环境变量,根据请求分配资源等。

一旦请求被初始化,ZEND虚拟机会将PHP解释成OPCODE,并运行。如需要调用扩展的函数,ZEND虚拟机会将参数绑定到该函数,并临时交出控制权直到函数结束。

在脚本运行结束后,PHP会调用每一个扩展的请求关闭函数(RSHUEDOWN),以执行最后的清理工作,随后ZEND虚拟机会执行清理过程,回收变量的内存。

请求关闭后,SAPI继续等待其他请求或是关闭信号,对于CGI和CLI等SAPI没有下一个请求,SAPI会立即关闭。关闭期间,PHP再次遍历每一个扩展,调用模块关闭函数(MSHUTDOWN),并最后关闭子系统。

总结以下要点:

1、PHP总共有三个模块:内核、Zend引擎、以及扩展层;

2、PHP内核用于处理请求、文件流、错误处理等相关操作;

3、Zend引擎用于将源文件转换成机器语言,然后在虚拟机上运行;(Zend虚拟机)

4、扩展层是一组函数、类库和流;

5、Zend虚拟机执行程序时,若需要连接若干扩展,会将控制器交给扩展,等处理完特定任务后返还;

6、Zend虚拟机将程序运行结果返回给PHP内核,再传送给SAPI层,最后输出到浏览器。

在TIPI有介绍不同的模型生命周期会略有不同。具体可以看第二章第一节。

PHP运行机制

PHP与JAVA、C#等编译型语言不同,为解释型语言。解释型语言无需经过编译即可运行,可以理解为直接运行,单并非直接被机器理解。编译型语言需要编译器将源码编译成机器语言,解释型语言则需要解释器来执行这些源码。注意,是执行,不是解释。其实解释型语言依然会有编译的过程,只不过一般都是实时编译。
PHP的运行机制大致为:
1、启动Zend引擎、加载注册的扩展模块
2、词法分析
3、语法分析
4、编译成OPCODE,执行

若安装了OPCODE缓存,编译将被跳过而直接从缓存读取OPCODE

PHP的并发模型

PHP本身是线程安全的。(这句话没怎么理解,后面需要再探讨一番。)PHP在并发模型上同时支持多线程模型及多进程模型,使用哪一种模型具体要看使用的SAPI。

目前比较推荐的PHP-FPM(FastCGI Process Manager:FastCGI进程管理器)使用的就是多进程模型,这种模型对于PHP由诸多的优势:
1、内存释放简单。使用多进程模型时,进程可以容易通过退出来是否内存,由于PHP有非常多的扩展,稍有不慎就可能导致内存泄漏,FPM可以通过进程退出的方式简单粗暴的解决问题。
2、容灾能力强,如果是单进程多线程模型,当扩展或PHP出现段错误,那么整个PHP就挂掉了。多进程模型的话某个进程挂掉也不会影响整体的服务。

多线程最大的好处是信息共享和通信方便。

多线程和多进程还有一个明显的模型区别:在处理请求时的逻辑。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息