这一篇多写一点内容,主要是今天终于有时间了。最近工作一直比较忙,公司里一大摊子事情需要处理,哥们首先得卖身混饭吃,其次才能在闲得蛋疼的时候写一点。闲话少叙,书接上回:
 
l  Apache的生命周期
这一节的内容将会阐述php模块的载入过程,请参考Apache的生命周期示意图(prefork模式下)。
php底层深度探索(3) ---Apache启动阶段分析 王泽宾_第1张图片
Apache的运行分为启动阶段和运行阶段。
 
1.         启动阶段
在启动阶段,Apache主要进行配置文件解析(例如http.conf以及Include指令设定的配置文件等)、模块加载(例如mod_php.so,mod_perl.so)和系统资源初始化(例如日志文件、共享内存段等)工作。
在这个阶段,Apache为了获得系统资源最大的使用权限,将以特权用户rootX系统)或超级管理员administrator(Windows系统)完成启动。
 
Apache和“php处理机”的装配过程就是在这个阶段完成的。
php处理机”就是负责解释和执行你的php代码的系统模块。这个名字是我特意创造的,目的是为了帮助你理解本节的内容,后面的章节还会给出更专业的名称。
 
你单独做过php的安装配置吗?
如果你做过类似的工作,下面的内容很容易理解;如果你没有做过,可以尝试安装一下,有助于加深你的理解。不过,我的文章向来深入浅出,我会尽量把这个过程讲得更浅显一些。其实php的安装非常简单,如果你很感兴趣的话,可以到网上随便搜一篇安装指南,按步骤照做就可以了。
php最终集成到Apache系统中,还需要对Apache进行一些必要的设置。这里,我们就以phpmod_php5 SAPI运行模式为例进行讲解,至于SAPI这个概念后面我们还会详细讲解。
假定我们安装的版本是Apache2 Php5,那么需要编辑Apache的主配置文件http.conf,在其中加入下面的几行内容:
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)进行处理。
 
这个过程可以参考以下的示意图:
 php底层深度探索(3) ---Apache启动阶段分析 王泽宾_第2张图片
 
 
Apache启动阶段的源码包含在server/main.c中,我整理了一下源码中的对应关系:
 
 
php底层深度探索(3) ---Apache启动阶段分析 王泽宾_第3张图片
 
不熟悉unix/linux的同学可能会问so文件(mod_php5.so)是个什么样的文件?
unix/linux,so后缀文件是一个DSO文件,DSOwindows系统下的dll是等价概念,都是把一堆函数封装在一个二进制文件中。调用它们的进程把它们装入内存后,会将其映射到自己的地址空间。
DSO全称为Dynamic Shared Object,即动态共享对象。DLL全称为Dynamic Link Library 即动态链接库。
Apache 服务器的体系结构的最大特点,就是高度模块化。如果你为了追求处理效率,可以把这些dso模块在apache编译的时候静态链入,这样会提高Apache 5%左右的处理性能。
 
2.         运行阶段
在运行阶段,Apache主要工作是处理用户的服务请求。
在这个阶段,Apache放弃特权用户级别,使用普通权限,这主要是基于安全性的考虑,防止由于代码的缺陷引起的安全漏洞,象微软的IIS就曾遭受“红色代码(Code Red)”和“尼姆达(Nimda)”等恶意代码的溢出***。