PHP相关概念及配置

时间:2022-02-08 15:37:56

基本概念简介

  首先想一个问题,客户端访问Web服务器,服务器将对应的资源响应给客户端,将属性还原成对应的格式后,浏览器能否解码对应格式的文档?

  MIME机制的出现就能够让http协议传送非文本信息了,如传一个MP3格式的音乐文件传送给客户端后,那么客户端能否使用浏览器去播放MP3格式的音乐呢?显然是不行的,浏览器仅能够解码HTML格式的文档。那么对于这样的多媒体音乐它应该怎么去处理呢?浏览器可通过浏览器插件或调用与之匹配的外部程序来对多媒体等格式的文件进行解码,而浏览器本身不能够播放音乐,要么是浏览器有插件可以播放音乐,要么是主机上有其它程序播放音乐,而浏览器可以直接调用那个程序执行。那这样一来浏览器处理文件的能力大大增强了,但其有一个隐患,若对方发送过来一段恶意代码,而这个代码恰恰是主机上某个程序可以执行的,因此有安全问题。

  因此,一般来说我们允许服务器端发送过来的仅仅是静态文档,像MP3音乐,还原成MP3后还是静态的,它是一种静态格式,不是一种程序,而是一个文件。那如果用户发来的是一个用C语言编译好的程序,那么发送到客户端后客户端无法识别,无法识别就不能直接去执行它,我们必须要调用一个外部程序执行它,这样就安全很多。

 

动态网站:

  我们在服务器端或客户端执行了一段脚本或一段程序,这个程序的执行结果根据不同用户、不同客户端、不同主机甚至不同的应用场景而不同,这种才称为是动态网站。所以动态网站一定是根据用户的请求作出对应响应的,甚至于对不同用户返回的内容是不一样的,根据客户端的请求来返回不同结果的。  

  动态网站有客户端动态和服务器端动态的概念:

  客户端动态意味着服务器端开发的源程序需要下载到本地并且在客户端本地的运行环境中执行并且将执行结果通过浏览器显示出来,这种就称作客户端动态。但如果允许在客户端随意执行脚本或程序的话,那么如果这个网站的制作者写了一段恶意代码或程序的话,甚至于客户被轻易的种上木马,所以有安全隐患,因此我们一般来讲不期望也不建议使用客户端动态;像早期Windows上的一种技术ActiveX,这就是一种在客户端执行程序的机制,还有像早期Java语言开发的Applet,Applet是Java开发的小程序,这个小程序需要在JVM(JVM是虚拟一个Java的运行沙箱,一个盒子,其中能够运行Java程序,Java需要独特的运行时环境,需要装载Java所需要的类、库等等,还需要管理Java的生命周期,所以这是一个独特的专门用来管理Java程序的一种虚拟化的环境)上运行,Applet能够让Web程序员开发出一个小程序,这个小程序直接放在Web服务器站点的目录当中,而后客户端可以直接访问这个小程序,把这个小程序下载至本地,并在本地的Java虚拟机中运行。所以得为浏览器安装JVM插件,但在客户端运行程序是不安全的,好在Java的程序只能在JVM中运行,如果破坏的话,破坏的在很大程度上也是JVM本身。但Applet还是要求在客户端安装一个插件进行配置,所以这对客户端提出了较高的要求,这对众多的用户来说是不可忍受的。由此,逐渐的把程序的运行机制返回至服务器端。

  服务器端动态

  CGI:让服务器能够执行程序的技术,CGI是一种协议,它能够让Web服务器进程根据那个对应的程序的不同调用对应的执行环境来运行那个对应的程序的文件,并且能够让程序的文件的运行结果重新取回至Web进程,这种协议就是CGI。其实任何语言都是可以开发动态网站的,而有些语言相比较来说,更适合开发Web应用程序(webapp,指的是在服务器运行的Web程序,这个程序在客户端访问这个页面的时候不是直接返回给客户端的,而是现在服务器端调用对应的执行程序执行后将结果格式化成HTML文档返回给客户端的)。

 

编程语言:

  静态语言(编译型语言):(静态语言是强类型的,而且一般来讲只有先编译才能运行)

    C、C++、Java

    优点:性能好(相比较而言,因为静态语言需要编译才能运行,像C或C++,编译完成后,只要它所依赖的库文件都存在就能直接运行,不依赖于任何外在的东西,它是一个具有独立执行入口的程序,而且它本身就是二进制格式的,所以运行速度非常快。)

    缺点:每一次改动都得重新编译、开发周期长、维护成本大(编译可能需要很长时间,最关键的是编译好的程序,发现错误后还得重新编译,因此静态语言的错误查找、错误追踪、调试都是比较困难的,所以在这方面不如动态语言便捷,每一次改动都得重新编译。因此,像C/C++更适合开发底层项目,对性能要求非常高的场景(实时场景),如开发导弹控制程序、数据库服务器软件、操作系统、驱动程序等,比解释性语言性能至少提高30%以上)。

    因为C/C++做的很底层,能够直接操纵硬件,所以性能非常好,以至于它们的用户接口不是那么的好,提供的库也不是那么规范,所以众多的功能都得自己手动去“造”,如造一辆汽车,轮胎的橡胶自己种、铝材自己生产。而动态语言等最接近用户的语言,它们有众多的别人开发好的模块,那就意味着*别人造好了,玻璃也造好了,拿过来一拼凑一辆车就造好了,开发周期非常短,因此静态语言开发周期长,维护成本大。

  动态语言(解释性语言):不需要编译,弱类型,变量可以在使用时直接拿来就用,不用事先声明。更重要的是在运行的时候用一个解释器解释执行即可。

    shell、Perl、Python

    优点:便于维护、有众多模块、开发周期短、开发成本低、维护成本小;

    缺点:性能差;

  Facebook使用动态语言开发网站,但是开发完成以后它们内部有一个专门的工具,这个工具能够将动态语言开发的程序转换成静态语言,这样就结合了动态语言和静态语言的好处。如:使用PHP开发程序,开发成本小、开发效率高,开发完成以后,他们自己公司有一个转换器,能够将PHP开发的程序转换成C++的程序,而后将C++编译当做网站程序运行起来。用户一访问是一个C++程序,而且是编译好的,直接就可以运行了,这样速度就非常快了。这个转换器就是Hiphop

  PHP --> Hiphop --> C++

  所以Facebook这样的站点性能是非常好的。

  无论如何,我们应该使用动态语言开发动态语言,因为开发速度是比较快的、周期是比较短的,而且维护起来比较方便。尽管如此,也不是所有动态语言都适合开发Web页面,如bash

  bash本身虽然是动态语言,但这个动态语言处理常见的Web应用场景的功能是非常小的,如:开发一个论坛,论坛中的众多用户要发帖、注册、在线、讨论,这些数据应该放在哪呢?bash如何有效跟这些数据交互呢?怎么使用bash快速的完成一段动作,一些特殊的处理机制,比如统计一下今天有哪些用户在线,每一个用户发了多少帖子,这些都是比较困难的,所以bash这种脚本语言拿来实现系统自动化则可,但是拿来开发Web程序是不合适的。

  那么哪些语言适合开发Web站点呢?

  Perl早期也不适合,它早期是脚本语言,单比bash功能更强一些,但是后来有人为Perl做了扩展,为Perl提供了一种模块,这种模块提供了以后使得Perl能够快速构建Web服务器站点。包括Python也是,Python基于某些框架后后却能快速开发Web服务器程序,Python开发Web服务器站点的框架叫做Django;Java同样如此,也不适合开发Web,后来设计了一种特殊的JSP类使得Java的生命周期可以在Web容器中进行了,所以使得使用了JSP这种语言也能够快速开发Web站点了,Java的JSP通常要运行在更快速的Web开发框架SSH。它们都需要依赖额外的框架,包括Ruby本身也是一种脚本语言,开发服务器站点需要的一种框架叫rails,所以有一种语言叫Ruby on rails,简称ror。

  PHP不需要框架即可开发Web服务器站点,因为它本身设计就是用来开发Web服务器应用程序,当然还有ASP

学习编程的步骤:

  基本语法:控制结构、面向对象...

  算法、数据结构

  编译原理(运行原理)

  需要思考怎么利用计算机本身的特性实现高性能开发,如高效的利用CPU的寄存器实现运算。

 

PHP相关知识

PHP(PHP is Hypertext Preprocessor,超文本预处理器)

  能够将超文本事先在服务器上运行一下后,将结果返回给服务器。因此称为预处理器。

  任何一种语言开发的程序,如bash开发的程序,我们在运行的时候,如果一不小心将它里面的一个关键字写错了,我们期望结果解释器会提示语法错误,并且不让执行,那么解释器怎么知道有语法错误呢?

  所以一般来讲,任何一种编程语言,它的解释器或编译器这种工具需要有几个能力

  • 词法分析:把每一个语句通过空格作为切片,看看哪个是关键字、哪个是变量、哪个是用户定义的、哪些是数据、哪些是控制结构等等,这叫词法分析。分析关键字,找出其中的变量声明等等相关功能;
  • 语法分析:判断整个程序当中有没有语法上的错误;
  • 生成执行路径:转换成可执行格式,编译或解释执行;

  而parser就是一个分析器,它能做词法分析、句法分析的。

    

  PHP本身是一种解释性语言,意味着PHP开发的程序要想执行,只需要用PHP解释器解释(即:词法分析、语法分析、执行)就可以了,但这个速度是非常慢的。要想提高速度,只需将PHP源代码(source code) --> 编译(不是静态编译(不是用户手动编译),还是PHP解释器编译的)成二进制 --> PHP解释器执行二进制格式。所以zend Engine的出现将PHP执行由本来解释执行(此时只有一个阶段)转换成了先编译后执行的过程。

    这就意味着将来去访问任何一个PHP页面的时候,这个页面首先在服务器上先编译一下,所以结果是第一次访问慢,第二次访问直接执行编译号的二进制格式了,所以速度要快的多。很显然,把PHP程序放上去后,挨个的编译好了之后,再让用户访问速度就提升了。所以出现了Zend Engine后,将整个程序变成了两段式的。首先词法分析、句法分析、编译,而后执行。而它的编译结果叫做opcode(PHP的操作码)。opcode接近于二进制格式,但是不能独立执行,虽然是二进制格式,但跟Java程序一样,只能在JVM中运行,所以可以把Zend理解成opcode或PHP的虚拟机。因此,它只能在Zend Engine中运行。

    PHP每一次编译时,编译的结果存放的位置比较独特,这个编译的结果opcode不是放在磁盘上的,而是放在内存中的,所以我们说这是一种动态编译的中间语言,源程序都在磁盘上,那这就带来一个问题,如果某一个特定用户访问的时候,他启动了一个PHP进程,这个进程发现用户访问的是一个文件,假如叫1.php,而第二个用户启动了第二个PHP进程,同时第二个用户访问的还是1.php,但这两个用户访问的进程不是同一个进程,而且用户所访问的这个文件需要先编译再执行,那这个编译是由Zend Engine负责完成,那Zend Engine编译好后放在内存中的对应进程的地址空间当中。而进程的地址空间对于每个进程都是不同的,而且数据是不互通的,那意味着对于第一个用户访问的zend Engine访问的编译结果第二个进程不能用到这个加速机制。所以每一个进程都需要独立编译,那使得PHP的执行效率是比较慢的,就算编译了,在同一个进程内部很快,同一个文件被多次,以后再访问速度都会很快,但是其它进程访问同一个文件不会被加速的。那么能否有一个机制让两者都能加速呢?

    可以提供一个程序,这个程序能提供一个缓存,将任何一个程序所编译的opcode放在这个缓存中间,而且这些程序都可以到缓存中去取这个编译的结果。需要注意的是,此时任何一个程序编译好的opcode不再放在自己的地址空间中,而是放在缓存空间当中,注意这个缓存就是一个地址空间,而这个空间是可以被众多的PHP进程所共享的,那因此第一个PHP进程编译好放在这,第二个进程就可以直接使用了,所以只要不涉及到私有数据(信息),这些进程直接都可以共享编译结果。而这个程序就叫做PHP的加速器(或者叫PHP的opcode缓存器)。

 

一、PHP简介

  PHP是通用服务器端脚本编程语言,其主要用于web开发以实现动态web页面,它也是最早实现将脚本嵌入HTML源码文档中的服务器端脚本语言之一。同时,php还提供了一个命令行接口,因此,其也可以在大多数系统上作为一个独立的shell来使用。

  Rasmus Lerdorf于1994年开始开发PHP,它起初是一组被Rasmus Lerdorf称作“Personal Home Page Tool” 的Perl脚本, 这些脚本可以用于显示作者的简历并记录用户对其网站的访问。后来,Rasmus Lerdorf使用C语言将这些Perl脚本重写为CGI程序,还为其增加了运行Web forms的能力以及与数据库交互的特性,并将其重命名为“Personal Home Page/Forms Interpreter”或“PHP/FI”。此时,PHP/FI已经可以用于开发简单的动态web程序了,这即是PHP 1.0。1995年6月,Rasmus Lerdorf把它的PHP发布于comp.infosystems.www.authoring.cgi Usenet讨论组,从此PHP开始走进人们的视野。1997年,其2.0版本发布。

  1997年,两名以色列程序员Zeev Suraski和Andi Gutmans重写的PHP的分析器(parser)成为PHP发展到3.0的基础,而且从此将PHP重命名为PHP: Hypertext Preprocessor。此后,这两名程序员开始重写整个PHP核心,并于1999年发布了Zend Engine 1.0,这也意味着PHP 4.0的诞生。2004年7月,Zend Engine 2.0发布,由此也将PHP带入了PHP5时代。PHP5包含了许多重要的新特性,如增强的面向对象编程的支持、支持PDO(PHP Data Objects)扩展机制以及一系列对PHP性能的改进。

二、PHP Zend Engine

  Zend Engine是开源的、PHP脚本语言的解释器,它最早是由以色列理工学院(Technion)的学生Andi Gutmans和Zeev Suraski所开发,Zend也正是此二人名字的合称。后来两人联合创立了Zend Technologies公司。

  Zend Engine 1.0于1999年随PHP 4发布,由C语言开发且经过高度优化,并能够做为PHP的后端模块使用。Zend Engine为PHP提供了内存和资源管理的功能以及其它的一些标准服务,其高性能、可靠性和可扩展性在促进PHP成为一种流行的语言方面发挥了重要作用。

  Zend Engine的出现将PHP代码的处理过程分成了两个阶段:首先是分析PHP代码并将其转换为称作Zend opcode的二进制格式(类似Java的字节码),并将其存储于内存中;第二阶段是使用Zend Engine去执行这些转换后的Opcode。

三、PHP的Opcode

  Opcode是一种PHP脚本编译后的中间语言,就像Java的ByteCode,或者.NET的MSL。PHP执行PHP脚本代码一般会经过如下4个步骤(确切的来说,应该是PHP的语言引擎Zend):

1、Scanning(Lexing) —— 将PHP代码转换为语言片段(Tokens)(即词法分析(词法扫描))

2、Parsing —— 将Tokens转换成简单而有意义的表达式(语法分析,Parsing与parse是两码事,如把数值赋值成变量的过程,一般来讲是在这完成)

3、Compilation —— 将表达式编译成Opocdes

4、Execution —— 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能

四、php的加速器

  基于PHP的特殊扩展机制如opcode缓存扩展也可以将opcode缓存于php的共享内存中,从而可以让同一段代码的后续重复执行时跳过编译阶段以提高性能。由此也可以看出,这些加速器并非真正提高了opcode的运行速度,而仅是通过分析opcode后并将它们重新排列以达到快速执行的目的。

常见的php加速器有:

1、APC (Alternative PHP Cache)

遵循PHP License的开源框架,PHP opcode缓存加速器,目前的版本不适用于PHP 5.4。项目地址,http://pecl.php.net/package/APC。

2、eAccelerator

源于Turck MMCache,早期的版本包含了一个PHP encoder和PHP loader,目前encoder已经不在支持。项目地址, http://eaccelerator.net/。

3、XCache

快速而且稳定的PHP opcode缓存,经过严格测试且被大量用于生产环境。项目地址,http://xcache.lighttpd.net/

4、Zend Optimizer和Zend Guard Loader

Zend Optimizer并非一个opcode加速器,它是由Zend Technologies为PHP5.2及以前的版本提供的一个免费、闭源的PHP扩展,其能够运行由Zend Guard生成的加密的PHP代码或模糊代码。 而Zend Guard Loader则是专为PHP5.3提供的类似于Zend Optimizer功能的扩展。项目地址,http://www.zend.com/en/products/guard/runtime-decoders

    (php是一个网站程序,而这个源代码要拿来执行的,如果我们作为一个商业公司开发一个源代码程序,想提供给众多公司都能使用,那卖给第一个公司后,第一个公司拿来做盗版的话会很简单,那为了避免盗版,需要把PHP源代码加密,一加密看到的就是乱码,那就没办法卖了,但可以给使用码,将这个使用码放在公司的服务器上能运行,这就是所谓的授权码,现在问题是,要把PHP加密后做成一堆乱码了,PHP解释器就不能解释执行了,而Zend Optimizer能够识别加密后的代码,用Zend Guard加密,用Zend Optimizer去执行。所以就能实现PHP加密了。)

5、NuSphere PhpExpress

NuSphere的一款开源PHP加速器,它支持装载通过NuSphere PHP Encoder编码的PHP程序文件,并能够实现对常规PHP文件的执行加速。项目地址,http://www.nusphere.com/products/phpexpress.htm

(作为运维将来对到公司工作的时候,维护的很有可能维护的就是一个PHP服务器或JSP服务器,所以上述内容一定要弄清楚,理解这段原理将来才能知道怎么去优化服务器的执行的,为什么要装xcache?它到底在多大程度上起到了加速作用,怎么去调整xcache的性能,建立了一个缓存,它肯定有一个缓存空间,缓存空间有多大,缓存中的条目应该缓存多长时间,有效期怎么去管理,这一切都是跟PHP本身基本原理相关的,配置很简单,理解有点困难,一定要把原理搞清楚)

五、PHP源码目录结构

PHP的源码在结构上非常清晰。其代码根目录中主要包含了一些说明文件以及设计方案,并提供了如下子目录:

1、build —— 顾名思义,这里主要放置一些跟源码编译相关的文件,比如开始构建之前的buildconf脚本及一些检查环境的脚本等。

2、ext —— 官方的扩展目录,包括了绝大多数PHP的函数的定义和实现,如array系列,pdo系列,spl系列等函数的实现。 个人开发的扩展在测试时也可以放到这个目录,以方便测试等。(PHP支持众多的扩展,如PHP能够使用一些加密库处理用户数据的时候进行加密等等)

3、main —— 这里存放的就是PHP最为核心的文件了,是实现PHP的基础设施,这里和Zend引擎不一样,Zend引擎主要实现语言最核心的语言运行环境。

4、Zend —— Zend引擎的实现目录,比如脚本的词法语法解析,opcode的执行以及扩展机制的实现等等。

5、pear —— PHP 扩展与应用仓库,包含PEAR的核心文件。

6、sapi —— 包含了各种服务器抽象层的代码,例如apache的mod_php,cgi,fastcgi以及fpm等等接口。

7、TSRM —— PHP的线程安全是构建在TSRM库之上的,PHP实现中常见的*G宏通常是对TSRM的封装,TSRM(Thread Safe Resource Manager)线程安全资源管理器。

8、tests —— PHP的测试脚本集合,包含PHP各项功能的测试文件。

9、win32 —— 这个目录主要包括Windows平台相关的一些实现,比如sokcet的实现在Windows下和*Nix平台就不太一样,同时也包括了Windows下编译PHP相关的脚本。

 

PHP理论基础及相关配置

PHP官方站点:www.php.net

  下载源程序后,需要解压、编译才能运行,PHP虽然是一种解释型语言,但PHP本身确实需要编译才能运行的程序,就像bash一样,bash开发的脚本都是脚本,但bash本身确是二进制程序。

 

  PHP既然是能够开发webapp的一种开发语言,这种语言只有在PHP的解释器中需要zend Engine编译后才能执行,但编译结果如何能够跟Apache的服务器结合起来?

CGICommon Gateway Interface,通用网关接口,让Web服务器能够跟后端程序相结合的,调用后端程序执行应用程序的一种接口(协议)。

    PHP也是一种动态开发语言,那Web服务器Apache也仅仅是能够提供静态HTML文档或者其他静态文件,像图形、图片、MP3等静态文件的一种服务器,如果说要想执行PHP程序的话,Apache自身是不能执行PHP程序的,要想执行PHP脚本需要PHP解释器,那Apache进程与解释器之间如何建立关联关系?

 

    Apache模块正在运行,突然间发现用户访问的是一个PHP页面如1.php,他发现这需要用PHP处理器处理,于是它通过CGI这种机制去调用PHP解释器去解释执行这段代码并且将解释的执行之后的代码返回给Apache,由Apache将这个返回的内容直接响应给客户端了。

  需要注意的是,用户请求的一定是Web服务器对象,这个对象要么是一个纯文本文件、图片、甚至视频等,但用户请求的是PHP文档,这个文档是程序,这个程序需要执行,执行后的结果是什么?执行后的结果是一段数据流,Apache直接将这个数据流响应给客户端了,因为Apache自身不需要将数据流保存成数据文件,况且就算请求的是静态文件,这个文件保存在磁盘上,这个文件要被Apache访问,它最后同样要转换成数据流(01代码),数据流要通过网线发给客户端。由此,既然PHP解释器直接返回的是数据流,Apache直接把数据流响应给客户端即可。

  对于一个网页文件(HTML)而言是有格式的,如:

PHP相关概念及配置

  但是写一个bash脚本test.sh,内容如下:

PHP相关概念及配置

  这个程序的执行结果并不是HTML格式的文档,因此浏览器最后显示为纯文本了。但这些纯文本信息的显示对用户体验并不友好。由此应该以HTML格式显示给用户。如何能够为纯文本生成HTML格式的标签呢?

 

PHP相关概念及配置

PHP相关概念及配置

  从上图可看出当前Apache是支持cgi的。

  而若要支持CGI还需要找到另外一个指令:ScriptAlias,用来定义在哪个目录中执行脚本的:

PHP相关概念及配置

    /cgi-bin/:访问路径(URL或Alias);

    /var/www/cgi-bin/:访问的目录;

  因此到/var/www/cgi-bin/目录下写一个脚本:

PHP相关概念及配置

PHP相关概念及配置

PHP相关概念及配置

PHP相关概念及配置

PHP相关概念及配置

    从上图可以看出,直接访问这个脚本,无法执行,因为Apache理解不了这个脚本。

    再看test.sh:

PHP相关概念及配置

PHP相关概念及配置

PHP相关概念及配置

PHP相关概念及配置

  这个脚本是可以执行的。

  修改:

PHP相关概念及配置

PHP相关概念及配置

PHP相关概念及配置

PHP相关概念及配置  所以脚本自身所处理的数据的结果,这个数据本身都是纯ASCII码,它是一些纯文本流,这些纯文本流应该格式化成在网页上显示起来更方便查看的HTML格式的文档。

但是当以后代码修改时,对应的由标签组成的架构也需要修改,这是非常麻烦的,因此需要将数据处理的逻辑与框架分离,最后通过某种方式将它们拼合起来,这种机制称为MVC,也可以叫做嵌入式开发语言。

推荐书籍:《大话设计模式》

 

那么Web服务器如何与PHP交互?

    基于CGI的模式,Apache进程如果发现客户端访问了PHP页面,它会调用PHP解释器解释器执行这段程序,既然是执行代码的程序就会启动一个进程生成一个新进程,一旦执行结束以后这个进程即被销毁。但如果用户访问的程序既有1.php又有2.php3.php,它是开三个进程,还是一个进程访问3个页面呢?假如1调用2,2调用3,只需要一个进程即可,但如果说各自独立调用需要启动3个进程,这些进程什么时候启动什么时候结束由CGI控制,因此PHP解释器进程生命周期的管理也是由Apache管理的

  更重要的是,假如web服务器里面的众多的都是PHP页面,如200PHP页面,3000静态内容(static content),若基于prefork模型,试想200个请求同时来访问PHP页面的时候(假设请求同时到达,不考虑静态),当前服务器上应该运行多少个进程呢?至少是400个,因为每一个PHP也需要启动一个进程,所以基于这种模式进行处理的时候会发现它运行的进程会超出想象,若一个Apache进程需要2M,而一个PHP进程的大小则取决于数据和程序了,假如处理的数据比较大,一个进程10M20M50M都有可能,而http是一种无状态的协议(stateless,所以每一个请求都是独立建立的,假如我们还没有使用长连接,随时在线访问的进程都有200个那就意味着频繁的创建与销毁进程系统开销是非常大的,系统性能会显著降低的。

  所以对于PHP来讲,CGI这种机制并不是一种优良的机制,对于大量用户并发来讲尤其如此。因此将Web进程与CGI进程合二为一就简单多了,那么如何合二为一呢?Apache支持DSODynamic Share Object,动态共享对象)机制Apache有众多模块使用load moduling加载进来,不加载就不支持这个功能,要想使用这个功能加载进来就可以了。事实上,完全可以实现将PHP做成Apache的一个动态共享模块的,将PHP编译成php_mod,当Apache用到时,直接将这个模块装载进来去解释PHP的内容即可。这也就意味着,在Apache进程内部就能自己装载进这个模块来完成对于PHP页面的加载并且能够将加载生成的结果不用再进行进程间通信,直接转交给前端的处理程序即可。所以就使得就算有200个进程同时访问,也只需要启动200个进程处理即可。但有一缺陷就是Apache进程既要处理静态内容又要处理动态内容,虽然已经大大简化了cgi这种模式所具有的缺陷,但依然有着性能上的缺陷,尤其是200个用户而服务器最多允许250个请求同时进来,而假如说在峰值的并发时刻,已经有400个用户同时到来了,服务器不能应付所有情况了。此时就需要在加一台服务器了,而且基于Nginx两台A记录做负载均衡,用户的请求有的到第一个服务器上,有的到第二个服务器上,这样就简单许多了。但进程本身需要处理动态和静态内容,进程本身的过程会很复杂,使得整个服务器的改进会变得非常困难,由此就有了第三种让PHPApache结合的模式,就是让Apache的静态内容处理和动态内容处理相分离。虽然这同CGI一样,是使用不同的进程完成的,但不同的是CGI是在用户请求时由Apache临时创建CGI进程的。由此我们可以安装一个PHP服务器,自身可以向Apacheprefork一样,事先生成很多空闲进程,不需要Apache管理,什么时候销毁这个进程、什么时候生成这个进程,由这个服务器自我管理。前端的Apache进程需要用到PHP功能了,只需要向服务器发送请求,服务器找一个空闲进程分配给它响应即可,当分配给Apache的进程执行结束,这个进程被服务器收回来,由服务器自我管理销毁,此时Apache或后端服务器的通信就不再是CGI了。可以理解成是基于另外一种独立的服务器客户端之间的协议,这个时候Apache服务器是客户端,PHP是服务器,这种机制称为FastCGI类似于刚才解释的这种机制,在PHP5.4中已经自带了这种功能,叫fpm(fast php module,快速功能模块)。

 

apachePHP结合的方式:

   CGI

   Module(最简单的方式)

   FastCGI(固然性能比较好,但配置较麻烦)

 

 

注意:若Apache仅提供静态功能的话,Nginx性能(处理静态内容时)则比Apache好的多,所以使用fastcgi时通常使用Nginx+fpm。有些时候可能需要依赖于Apache某些模块,此时就需要使用Apache了。

 

配置Web服务器使用PHP的功能

PHP相关概念及配置

 

    (php5.3.3不支持fpm,php5.3.4才支持)

 

 

 

 

 

 

 

PHP相关概念及配置

    php-mbstring:(Multi Byte)对国际化的支持

查看安装php生成的功能:

PHP相关概念及配置

PHP相关概念及配置

PHP相关概念及配置

    Apache基于prefork或worker模型时,它们所依赖php的模块是不同的。

    AddHandler:添加一个处理器,若是一个以.php结尾的文件的话,就使用php5-script工具处理。php5-script这是Apache内置的一种处理机制,能够实现在内部完成怎么去识别这种文件的。

    AddType:添加类别,text/html,多媒体类型,能将.php识别成纯文本格式,当然需要先执行的。

    DirectoryIndex:定义默认的主页面;

PHP相关概念及配置

PHP相关概念及配置

    phpinfo();  #php内置函数,能够以Web页面的方式显示服务器内部信息;

PHP相关概念及配置

PHP相关概念及配置

php配置文件:/etc/php.ini

  配置文件格式如:

PHP相关概念及配置

  每一段的标识的配置只对对应段生效,称为分段式的配置。因为php的模块很多,每一个模块使用的指令可能都不一样,所以分为全局的,对每一个模块都生效的,还有局部的,对每一个特定模块生效的。

PHP相关概念及配置

PHP相关概念及配置

  注意:.ini配置文件使用";"作为注释符;

 

  由此,php就能直接工作了!!!