zoukankan      html  css  js  c++  java
  • php底层深度探索(3) Apache启动阶段分析 王泽宾

    这一篇多写一点内容,主要是今天终于有时间了。最近工作一直比较忙,公司里一大摊子事情需要处理,哥们首先得卖身混饭吃,其次才能在闲得蛋疼的时候写一点。闲话少叙,书接上回:

     

    l         Apache的生命周期

    这一节的内容将会阐述php模块的载入过程,请参考Apache的生命周期示意图(prefork模式下)。

    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)进行处理。

     

    这个过程可以参考以下的示意图:

     

     

     

     

    Apache启动阶段的源码包含在server/main.c中,我整理了一下源码中的对应关系:

     

      

     

    不熟悉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)”等恶意代码的溢出攻击。

  • 相关阅读:
    Java Lambda 表达式 对 Map 对象排序
    比较两个list对象是否相同
    ubuntu redis 自启动配置文件(关机有密码)
    spring中订阅redis键值过期消息通知
    网站架构之性能优化(转)
    Json转Java Bean
    spring mvc 4 校验
    java @ResponseBody返回值中去掉NULL字段
    合并两个java bean对象非空属性(泛型)
    spring mvc 删除返回字符串中值为null的字段
  • 原文地址:https://www.cnblogs.com/wanghao72214/p/1394088.html
Copyright © 2011-2022 走看看