详解PHP的执⾏原理和流程
⽬录
简介
PHP启动第⼀步
PHP启动第⼆步
PHP关闭第⼀步
PHP关闭第⼆步
PHP底层⼯作原理
①Zend引擎
②Extensions
③Sapi
④上层应⽤
构架思想
Apache和php的关系
Apache的⽣命周期
Apach的请求处理流程
Apache请求处理循环详解
1、Post-Read-Request阶段
2、URI Translation阶段
3、Header Parsing阶段
4、Access Control阶段
5、Authentication阶段
6、Authorization阶段
7、MIME Type Checking阶段
8、FixUp阶段
9、Response阶段
10、Logging阶段
11、CleanUp阶段
LAMP架构
简介
先看看下⾯这个过程:
• 我们从未⼿动开启过PHP的相关进程,它是随着Apache的启动⽽运⾏的;
php如何运行代码• PHP通过mod_php5.so模块和Apache相连(具体说来是SAPI,即服务器应⽤程序编程接⼝);
• PHP总共有三个模块:内核、Zend引擎、以及扩展层;
• PHP内核⽤来处理请求、⽂件流、错误处理等相关操作;
• Zend引擎(ZE)⽤以将源⽂件转换成机器语⾔,然后在虚拟机上运⾏它;
• 扩展层是⼀组函数、类库和流,PHP使⽤它们来执⾏⼀些特定的操作。⽐如,我们需要mysql扩展来连接MySQL数据库;• 当ZE执⾏程序时可能会需要连接若⼲扩展,这时ZE将控制权交给扩展,等处理完特定任务后再返还;
• 最后,ZE将程序运⾏结果返回给PHP内核,它再将结果传送给SAPI层,最终输出到浏览器上。
深⼊探讨
等等,没有这么简单。以上过程只是个简略版,让我们再深⼊挖掘⼀下,看看幕后还发⽣了些什么。
• Apache启动后,PHP解释程序也随之启动;
• PHP的启动过程有两步;
• 第⼀步是初始化⼀些环境变量,这将在整个SAPI⽣命周期中发⽣作⽤;
• 第⼆步是⽣成只针对当前请求的⼀些变量设置。
PHP启动第⼀步
不清楚什么第⼀第⼆步是什么?别担⼼,我们接下来详细讨论⼀下。让我们先看看第⼀步,也是最主要的⼀步。要记住的是,第⼀步的操作在任何请求到达之前就发⽣了。
• 启动Apache后,PHP解释程序也随之启动;
• PHP调⽤各个扩展的MINIT⽅法,从⽽使这些扩展切换到可⽤状态。看看php.ini⽂件⾥打开了哪些扩展吧;
• MINIT的意思是“模块初始化”。各个模块都定义了⼀组函数、类库等⽤以处理其他请求。
⼀个典型的MINIT⽅法如下:
PHP_MINIT_FUNCTION(extension_name){
/* Initialize functions, classes etc */
}
PHP启动第⼆步
• 当⼀个页⾯请求发⽣时,SAPI层将控制权交给PHP层。于是PHP设置了⽤于回复本次请求所需的环境变量。同时,它还建⽴⼀个变量表,⽤来存放执⾏过程中产⽣的变量名和值。
• PHP调⽤各个模块的RINIT⽅法,即“请求初始化”。⼀个经典的例⼦是Session模块的RINIT,如果在php.ini中启⽤了Session 模块,那在调⽤该模块的RINIT时就会初始化$_SESSION变量,并将相关内容读⼊;
• RINIT⽅法可以看作是⼀个准备过程,在程序执⾏之间就会⾃动启动。
⼀个典型的RINIT⽅法如下:
PHP_RINIT_FUNCTION(extension_name) {
/* Initialize session variables, pre-populate variables, redefine global variables etc */
}
PHP关闭第⼀步
如同PHP启动⼀样,PHP的关闭也分两步:
• ⼀旦页⾯执⾏完毕(⽆论是执⾏到了⽂件末尾还是⽤exit或die函数中⽌),PHP就会启动清理程序。它会按顺序调⽤各个模块的RSHUTDOWN⽅法。
• RSHUTDOWN⽤以清除程序运⾏时产⽣的符号表,也就是对每个变量调⽤unset函数。
⼀个典型的RSHUTDOWN⽅法如下:
PHP_RSHUTDOWN_FUNCTION(extension_name) {
/* Do memory management, unset all variables used in the last PHP call etc */
}
PHP关闭第⼆步
最后,所有的请求都已处理完毕,SAPI也准备关闭了,PHP开始执⾏第⼆步:
• PHP调⽤每个扩展的MSHUTDOWN⽅法,这是各个模块最后⼀次释放内存的机会。
⼀个典型的RSHUTDOWN⽅法如下:
PHP_MSHUTDOWN_FUNCTION(extension_name) {
/* Free handlers and persistent memory etc */
}
这样,整个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可以不再考虑如何针对不同应⽤进⾏兼容,⽽应⽤本⾝也可以针对⾃⼰的特点实现不同的处理⽅式。后⾯将在sapi章节中介绍
④上层应⽤
这就是我们平时编写的php程序,通过不同的sapi⽅式得到各种各样的应⽤模式,如通过webserver实现web应⽤、在命令⾏下以脚本⽅式运⾏等等。
构架思想
引擎(Zend)+组件(ext)的模式降低内部耦合
中间层(sapi)隔绝web server和php
****************************************************************
如果php是⼀辆车,那么
车的框架就是php本⾝
Zend是车的引擎(发动机)
Ext下⾯的各种组件就是车的轮⼦
Sapi可以看做是公路,车可以跑在不同类型的公路上
⽽⼀次php程序的执⾏就是汽车跑在公路上。
因此,我们需要:性能优异的引擎+合适的车轮+正确的跑道
Apache和php的关系
Apache对于php的解析,就是通过众多Module中的php Module来完成的。
把php最终集成到Apache系统中,还需要对Apache进⾏⼀些必要的设置。这⾥,我们就以php的mod_php5 SAPI运⾏模式为例进⾏讲解,⾄于SAPI这个概念后⾯我们还会详细讲解。
假定我们安装的版本是Apache2 和 Php5,那么需要编辑Apache的主配置⽂件f,在其中加⼊下⾯的⼏⾏内容:
Unix/Linux环境下:
LoadModule php5_module modules/mod_php5.so
AddType application/x-httpd-php .php
注:其中modules/mod_php5.so 是X系统环境下mod_php5.so⽂件的安装位置。
Windows环境下:
LoadModule php5_module d:/php/php5apache2.dll
AddType application/x-httpd-php .php
注:其中d:/php/php5apache2.dll 是在Windows环境下php5apache2.dll⽂件的安装位置。
这两项配置就是告诉Apache Server,以后收到的Url⽤户请求,凡是以php作为后缀,就需要调⽤php5_module模块
(mod_php5.so/ php5apache2.dll)进⾏处理。
Apache的⽣命周期
Apach的请求处理流程
Apache请求处理循环详解
Apache请求处理循环的11个阶段都做了哪些事情呢?
1、Post-Read-Request阶段
在正常请求处理流程中,这是模块可以插⼊钩⼦的第⼀个阶段。对于那些想很早进⼊处理请求的模块来说,这个阶段可以被利⽤。
2、URI Translation阶段
Apache在本阶段的主要⼯作:将请求的URL映射到本地⽂件系统。模块可以在这阶段插⼊钩⼦,执⾏⾃⼰的映射逻辑。mod_alias就是利⽤这个阶段⼯作的。
3、Header Parsing阶段
Apache在本阶段的主要⼯作:检查请求的头部。由于模块可以在请求处理流程的任何⼀个点上执⾏检查请求头部的任务,因此这个钩⼦很少被使⽤。mod_setenvif就是利⽤这个阶段⼯作的。
4、Access Control阶段
Apache在本阶段的主要⼯作:根据配置⽂件检查是否允许访问请求的资源。Apache的标准逻辑实现了允许和拒绝指令。mod_authz_host就是利⽤这个阶段⼯作的。
5、Authentication阶段
Apache在本阶段的主要⼯作:按照配置⽂件设定的策略对⽤户进⾏认证,并设定⽤户名区域。模块可以在这阶段插⼊钩⼦,实现⼀个认证⽅法。
6、Authorization阶段
Apache在本阶段的主要⼯作:根据配置⽂件检查是否允许认证过的⽤户执⾏请求的操作。模块可以在这阶段插⼊钩⼦,实现⼀个⽤户权限管理的⽅法。
7、MIME Type Checking阶段
Apache在本阶段的主要⼯作:根据请求资源的MIME类型的相关规则,判定将要使⽤的内容处理函数。标准模块
mod_negotiation和mod_mime实现了这个钩⼦。
8、FixUp阶段
这是⼀个通⽤的阶段,允许模块在内容⽣成器之前,运⾏任何必要的处理流程。和Post_Read_Request类似,这是⼀个能够捕获任何信息的钩⼦,也是最常使⽤的钩⼦。
9、Response阶段
Apache在本阶段的主要⼯作:⽣成返回客户端的内容,负责给客户端发送⼀个恰当的回复。这个阶段是整个处理流程的核⼼部分。
10、Logging阶段
Apache在本阶段的主要⼯作:在回复已经发送给客户端之后记录事务。模块可能修改或者替换Apache的标准⽇志记录。11、CleanUp阶段
Apache在本阶段的主要⼯作:清理本次请求事务处理完成之后遗留的环境,⽐如⽂件、⽬录的处理或者Socket的关闭等等,这是Apache⼀次请求处理的最后⼀个阶段。
LAMP架构
从下往上四层:
①liunx 属于操作系统的底层
②apache服务器,属于次服务器,沟通linux和PHP
③php:属于服务端编程语⾔,通过php_module 模块和apache关联
④mysql和其他web服务:属于应⽤服务,通过PHP的Extensions外挂模块和mysql关联
以上就是详解PHP的执⾏原理和流程的详细内容,更多关于PHP执⾏原理和流程的资料请关注其它相关⽂章!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论