首页 - 神途资讯 > php高级

php高级

发布于:2024-02-18 作者:admin 阅读:159

简介先看看下面这个过程:

我们从未手动开启过PHP的相关进程,它是随着的启动而运行的;PHP通过.so模块和相连(具体说来是SAPI,即服务器应用程序编程接口);PHP总共有三个模块:内核、Zend引擎、以及扩展层;PHP内核用来处理请求、文件流、错误处理等相关操作;Zend引擎(ZE)用以将源文件转换成机器语言,然后在虚拟机上运行它;扩展层是一组函数、类库和流,PHP使用它们来执行一些特定的操作。比如,我们需要mysql扩展来连接MySQL数据库;当ZE执行程序时可能会需要连接若干扩展,这时ZE将控制权交给扩展,等处理完特定任务后再返还;最后,ZE将程序运行结果返回给PHP内核,它再将结果传送给SAPI层,最终输出到浏览器上。深入探讨等等,没有这么简单。以上过程只是个简略版,让我们再深入挖掘一下,看看幕后还发生了些什么。

启动后,PHP解释程序也随之启动;PHP的启动过程有两步;之一步是初始化一些环境变量,这将在整个SAPI生命周期中发生作用;第二步是生成只针对当前请求的一些变量设置。PHP启动之一步不清楚什么之一第二步是什么?别担心,我们接下来详细讨论一下。让我们先看看之一步,也是最主要的一步。要记住的是,之一步的操作在任何请求到达之前就发生了。

启动后,PHP解释程序也随之启动;PHP调用各个扩展的MINIT方法,从而使这些扩展切换到可用状态。看看php.ini文件里打开了哪些扩展吧;MINIT的意思是“模块初始化”。各个模块都定义了一组函数、类库等用以处理其他请求。一个典型的MINIT方法如下:(){/* , etc */}PHP启动第二步

当一个页面请求发生时,SAPI层将控制权交给PHP层。于是PHP设置了用于回复本次请求所需的环境变量。同时,它还建立一个变量表,用来存放执行过程中产生的变量名和值。PHP调用各个模块的RINIT方法,即“请求初始化”。一个经典的例子是模块的RINIT,如果在php.ini中启用了模块,那在调用该模块的RINIT时就会初始化$变量,并将相关内容读入;RINIT方法可以看作是一个准备过程,在程序执行之间就会自动启动。一个典型的RINIT方法如下:() {/* , pre- , etc */}PHP关闭之一步如同PHP启动一样,PHP的关闭也分两步:

一旦页面执行完毕(无论是执行到了文件末尾还是用exit或die函数中止),PHP就会启动清理程序。它会按顺序调用各个模块的方法。用以清除程序运行时产生的符号表,也就是对每个变量调用unset函数。一个典型的方法如下:ON() {/* Do , unset all used in the last PHP call etc */}PHP关闭第二步最后,所有的请求都已处理完毕,SAPI也准备关闭了,PHP开始执行第二步:

PHP调用每个扩展的方法,这是各个模块最后一次释放内存的机会。一个典型的方法如下:ON() {/* Free and etc */}这样,整个PHP生命周期就结束了。要注意的是,只有在服务器没有请求的情况下才会执行“启动之一步”和“关闭第二步”。

图1 php结构

从图上可以看出,php从下到上是一个4层体系

①Zend引擎

Zend整体用纯c实现,是php的内核部分,它将php代码翻译(词法、语法解析等一系列编译过程)为可执行的处理并实现相应的处理方法、实现了基本的数据结构(如、oo)、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕zend实现。

围绕着zend引擎,通过组件式的方式提供各种基础服务,我们常见的各种内置函数(如array系列)、标准库等都是通过来实现,用户也可以根据需要实现自己的以达到功能扩展、性能优化等目的(如贴吧正在使用的php中间层、富文本解析就是的典型应用)。

③Sapi

Sapi全称是 ,也就是服务端应用编程接口,sapi通过一系列钩子函数,使得php可以和外围交互数据,这是php非常优雅和成功的一个设计,通过sapi成功的将php本身和上层应用解耦隔离,php可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。后面将在sapi章节中介绍

④上层应用

这就是我们平时编写的php程序,通过不同的sapi方式得到各种各样的应用模式,如通过实现web应用、在命令行下以脚本方式运行等等。

构架思想:

引擎(Zend)+组件(ext)的模式降低内部耦合

中间层(sapi)隔绝web 和php

**************************************************************************

如果php是一辆车,那么

车的框架就是php本身

Zend是车的引擎(发动机)

Ext下面的各种组件就是车的轮子

Sapi可以看做是公路,车可以跑在不同类型的公路上

而一次php程序的执行就是汽车跑在公路上。

因此,我们需要:性能优异的引擎+合适的车轮+正确的跑道

把php最终集成到系统中,还需要对进行一些必要的设置。这里,我们就以php的 SAPI运行模式为例进行讲解,至于SAPI这个概念后面我们还会详细讲解。

假定我们安装的版本是 和 Php5,那么需要编辑的主配置文件http.conf,在其中加入下面的几行内容:

Unix/Linux环境下:

/.so

/x-httpd-php .php

注:其中/.so 是X系统环境下.so文件的安装位置。

环境下:

d:/php/.dll

/x-httpd-php .php

注:其中d:/php/.dll 是在环境下.dll文件的安装位置。

这两项配置就是告诉 ,以后收到的Url用户请求,凡是以php作为后缀,就需要调用模块(.so/ .dll)进行处理。

请求处理循环详解 请求处理循环的11个阶段都做了哪些事情呢?

1、Post-Read-阶段

在正常请求处理流程中,这是模块可以插入钩子的之一个阶段。对于那些想很早进入处理请求的模块来说,这个阶段可以被利用。

2、URI 阶段在本阶段的主要工作:将请求的URL映射到本地文件系统。模块可以在这阶段插入钩子,执行自己的映射逻辑。就是利用这个阶段工作的。

3、 阶段在本阶段的主要工作:检查请求的头部。由于模块可以在请求处理流程的任何一个点上执行检查请求头部的任务,因此这个钩子很少被使用。就是利用这个阶段工作的。

4、 阶段在本阶段的主要工作:根据配置文件检查是否允许访问请求的资源。的标准逻辑实现了允许和拒绝指令。就是利用这个阶段工作的。

5、阶段在本阶段的主要工作:按照配置文件设定的策略对用户进行认证,并设定用户名区域。模块可以在这阶段插入钩子,实现一个认证方法。

6、阶段在本阶段的主要工作:根据配置文件检查是否允许认证过的用户执行请求的操作。模块可以在这阶段插入钩子,实现一个用户权限管理的方法。

7、MIME Type 阶段在本阶段的主要工作:根据请求资源的MIME类型的相关规则,判定将要使用的内容处理函数。标准模块和实现了这个钩子。

8、FixUp阶段这是一个通用的阶段,允许模块在内容生成器之前,运行任何必要的处理流程。和类似,这是一个能够捕获任何信息的钩子,也是最常使用的钩子。

9、阶段在本阶段的主要工作:生成返回客户端的内容,负责给客户端发送一个恰当的回复。这个阶段是整个处理流程的核心部分。

10、阶段在本阶段的主要工作:在回复已经发送给客户端之后记录事务。模块可能修改或者替换的标准日志记录。

11、阶段 在本阶段的主要工作:清理本次请求事务处理完成之后遗留的环境,比如文件、目录的处理或者的关闭等等,这是一次请求处理的最后一个阶段。

二维码

扫一扫关注我们

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,请告知我们,本站将立刻删除涉嫌侵权内容。

相关文章