资源预览内容
第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
第9页 / 共12页
第10页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
在开始这个专题之前,先说一点题外话。大多数人学习编程语言的时候,首先关注的是这种语言的语法及其常用函数。反正,我学习C,Java,Php等语言就是按照这样的方式开始的。一般情况下,这个阶段需要一个月左右的时间就会完全掌握,并能基本熟练地使用。对于已有经验的同学,可能时间更短。其实各种语言的语法和常用函数都差别不大,有很多相通的地方。如果您在学习一种编程语言的时候,拿一些真正的项目任务作为实践,效果更佳,实践远胜于理论。我们在掌握了一门编程语言之后,又会向两个方向发展:一个方向是向上延伸,从事系统框架的探索;另一方向是向下延伸,从事系统底层方面的研究,我大体画了一下这个学习过程的曲线。 注:虽然我的形象一直用着“高高手”,但我只是个菜鸟,如有雷同,纯属巧合,欢迎善意拍砖。Php的语法非常简单,它不需要具备很多的知识就能上手,比如:你学习C语言,就必须非常了解各个变量如何定义,指针如何操作,内存如何创建销毁等等。再比如:你学习Java语言,就必须具有面向对象(OO)的基础,就必须清楚是什么时候需要封装,什么时候需要继承,什么时候需要多态,要做项目,怎么还得懂点SSH。Php的大部分使用者可能根本就没这么多讲究,有的人喜欢面向过程,那你就用面向过程的方式来写代码;有的人喜欢面向对象,那你就用面向对象的方式写代码。Php的产生缘于互联网,目前也是互联网第一大编程语言。满足需求永远是第一位的,可维护性暂且可以放在第2位,我们的Web应用永远是版的,计划远没有变化快。我们公司里有很多phper,我曾经问过他们:“php程序是如何被执行的?”,似乎多数人都很难说清楚。这其实不奇怪,我曾经拿类似的问题问过Javaer,Javaer的回答也基本如此。有的同学会问:“研究这样的问题有没有实际意义呢?”有!理解系统的底层,有助于写出高效健壮的代码,你会更清楚程序的代码到底该怎么写。另外,写php扩展的同学更是不必说,责无旁贷。要说清楚这个问题,最好的办法是阅读一下php的源码。我闲来无事,粗读了一遍,愿意与各位共享。关于php的底层工作原理,绕不开webserver,象apache,lighttpd,nginx,iis等。我这里就以apache开始。以下内容将结合apache的源码、工作原理和扩展来逐步切入php的解析过程。二、Apache运行机制剖析l B/S交互过程浏览器和服务器一次交互的过程如图:1、 浏览器(Browser)向服务器(Web Server)发出HTTP请求(Request)。2、 服务器(Web Server)分析浏览器的请求,输出响应数据(Response)。3、 浏览器(Browser)收到响应数据后进行解析,最后显示在浏览器中。下面是一份浏览器的请求数据和服务器的响应数据:以上内容非常简单,我想Web开发人员都很清楚这个过程,在此不再赘述。l Apache概述Apache是目前世界上使用最为广泛的一种Web Server,它以跨平台、高效、稳定而闻名,按照官方统计的数据,Apache服务器的装机量大约占据该市场60%以上的份额,尤其是在X(Unix/Linux)平台上最为普遍。另外的一些Web Server产品,比如IIS只能运行在Windows平台上,大多结合微软的.Net技术机构一起使用。Apache最为诟病的一点是越来越重,被认为是重量级的WebServer,所以后来又出现了很多轻量级的替代产品,比如lighttpd,nginx,它们的共同特点就是效率显著提高,但又往往只用于某些特定场合。l Apache组件逻辑图Apache是基于模块化设计的,核心代码其实并不多。你如果想要阅读Apache的源代码,建议你直接从core.c文件读起,主要的处理逻辑都包含在里面。Apache大多数的功能都被分散到各个模块中,系统启动的时候按需载入。MPM(Multi-ProcessingModules,多重处理模块)是Apache的核心组件,Apache通过MPM使用操作系统的资源,管理进程/线程池。另外,Apache为了能够获得最好的运行性能,他针对不同的平台(Unix/Linux、Window)做了优化,提供不同的MPM,其中最为常见的有prefork和worker两种。您的服务器跑的是哪种方式,取决于安装Apache过程中指定的编译参数。在X系统上默认编译为prefork模式。由于大多数的Unix都不支持真正的多线程,所以采用预派生子进程(prefork)方式,worker是一种基于多进程多线程混合的模式。对此感兴趣的同学可以阅读有关资料,此处不再多讲。Apache的逻辑构成以及与操作系统的关系APR(Apache portable Runtime Library),即Apache可移植运行库,是一个抽象库用来实现Apache内部组件对操作系统的使用。Apache对于php的解析,就是通过图中所标的php Module完成的。l Apache的生命周期这一节的内容会与php模块的载入有关,您可以略微关注一下。以下图形用来说明Apache的生命周期(prefork模式)。这一篇多写一点内容,主要是今天终于有时间了。最近工作一直比较忙,公司里一大摊子事情需要处理,哥们首先得卖身混饭吃,其次才能在闲得蛋疼的时候写一点。闲话少叙,书接上回:lApache的生命周期这一节的内容将会阐述php模块的载入过程,请参考Apache的生命周期示意图(prefork模式下)。Apache的运行分为启动阶段和运行阶段。1. 启动阶段在启动阶段,Apache主要进行配置文件解析(例如http.conf以及Include指令设定的配置文件等)、模块加载(例如mod_php.so,mod_perl.so等)和系统资源初始化(例如日志文件、共享内存段等)工作。在这个阶段,Apache为了获得系统资源最大的使用权限,将以特权用户root(X系统)或超级管理员administrator(Windows系统)完成启动。Apache和“php处理机”的装配过程就是在这个阶段完成的。“php处理机”就是负责解释和执行你的php代码的系统模块。这个名字是我特意创造的,目的是为了帮助你理解本节的内容,后面的章节还会给出更专业的名称。你单独做过php的安装配置吗?如果你做过类似的工作,下面的内容很容易理解;如果你没有做过,可以尝试安装一下,有助于加深你的理解。不过,我的文章向来深入浅出,我会尽量把这个过程讲得更浅显一些。其实php的安装非常简单,如果你很感兴趣的话,可以到网上随便搜一篇安装指南,按步骤照做就可以了。把php最终集成到Apache系统中,还需要对Apache进行一些必要的设置。这里,我们就以php的mod_php5 SAPI运行模式为例进行讲解,至于SAPI这个概念后面我们还会详细讲解。假定我们安装的版本是Apache2 和 Php5,那么需要编辑Apache的主配置文件http.conf,在其中加入下面的几行内容:Unix/Linux环境下:LoadModule php5_module modules/mod_php5.soAddType 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文件,DSO与windows系统下的dll是等价概念,都是把一堆函数封装在一个二进制文件中。调用它们的进程把它们装入内存后,会将其映射到自己的地址空间。DSO全称为Dynamic Shared Object,即动态共享对象。DLL全称为Dynamic Link Library 即动态链接库。Apache 服务器的体系结构的最大特点,就是高度模块化。如果你为了追求处理效率,可以把这些dso模块在apache编译的时候静态链入,这样会提高Apache 5%左右的处理性能。2. 运行阶段在运行阶段,Apache主要工作是处理用户的服务请求。在这个阶段,Apache放弃特权用户级别,使用普通权限,这主要是基于安全性的考虑,防止由于代码的缺陷引起的安全漏洞,象微软的IIS就曾遭受“红色代码(Code Red)”和“尼姆达(Nimda)”等恶意代码的溢出攻击。2、运行阶段 2.1 运行阶段概述 在运行阶段,Apache主要工作是处理用户的服务请求。 在这个阶段,Apache放弃特权用户级别,使用普通权限,这主要是基于安全性的考虑,防止由于代码的缺陷引起的安全漏洞。象微软的IIS就曾遭受“红色代码(Code Red)”和“尼姆达(Nimda)”等恶意代码的溢出攻击。u2.2 运行阶段流程 Apache将请求处理循环分为11个阶段,依次是:Post-Read-Request,URI Translation,Header Parsing,Access Control,Authentication,Authorization,MIME Type Checking,FixUp,Response,Logging,CleanUp。 Apache Hook机制 Apache的Hook机制是指:Apache 允许模块(包括内部模块和外部模块,例如mod_php5.so,mod_perl.so等)将自定义的函数注入到请求处理循环中。换句话说,模块可以在Apache的任何一个处理阶段中挂接(Hook)上自己的处理函数,从而参与Apache的请求处理过程。 mod_php5.so/ php5apache2.dll就是将所包含的自定义函数,通过Hook机制注入到Apache中,在Apache处理流程的各个阶段负责处理php请求。 关于Hook机制在Windows系统开发也经常遇到,在Windows开发既有系统级的钩子,又有应用级的钩子。常见的翻译软件(例如金山词霸等等)的屏幕取词功能,大多数是通过安装系统级钩子函数完成的,将自定义函数替换gdi32.dll中的屏幕输出的绘制函数。 Apache请求处理循环详解 Apache请求处理循环的11个阶段都做了哪些事情呢? 1、Post-Read-Request阶段 在正常请求处理流程中,这是模块可以插入钩子的第一个阶段。对于
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号