首先想一个问题,客户端访问Web服务器,服务器将对应的资源响应给客户端,将属性还原成对应的格式后,浏览器可否解码对应格式的文档?php
MIME机制的出现就可以让http协议传送非文本信息了,如传一个MP3格式的音乐文件传送给客户端后,那么客户端可否使用浏览器去播放MP3格式的音乐呢?显然是不行的,浏览器仅可以解码HTML格式的文档。那么对于这样的多媒体音乐它应该怎么去处理呢?浏览器可经过浏览器插件或调用与之匹配的外部程序来对多媒体等格式的文件进行解码,而浏览器自己不可以播放音乐,要么是浏览器有插件能够播放音乐,要么是主机上有其它程序播放音乐,而浏览器能够直接调用那个程序执行。那这样一来浏览器处理文件的能力大大加强了,但其有一个隐患,若对方发送过来一段恶意代码,而这个代码偏偏是主机上某个程序能够执行的,所以有安全问题。html
所以,通常来讲咱们容许服务器端发送过来的仅仅是静态文档,像MP3音乐,还原成MP3后仍是静态的,它是一种静态格式,不是一种程序,而是一个文件。那若是用户发来的是一个用C语言编译好的程序,那么发送到客户端后客户端没法识别,没法识别就不能直接去执行它,咱们必需要调用一个外部程序执行它,这样就安全不少。前端
动态网站:程序员
咱们在服务器端或客户端执行了一段脚本或一段程序,这个程序的执行结果根据不一样用户、不一样客户端、不一样主机甚至不一样的应用场景而不一样,这种才称为是动态网站。因此动态网站必定是根据用户的请求做出对应响应的,甚至于对不一样用户返回的内容是不同的,根据客户端的请求来返回不一样结果的。 web
动态网站有客户端动态和服务器端动态的概念:算法
客户端动态意味着服务器端开发的源程序须要下载到本地而且在客户端本地的运行环境中执行而且将执行结果经过浏览器显示出来,这种就称做客户端动态。但若是容许在客户端随意执行脚本或程序的话,那么若是这个网站的制做者写了一段恶意代码或程序的话,甚至于客户被轻易的种上木马,因此有安全隐患,所以咱们通常来说不指望也不建议使用客户端动态;像早期Windows上的一种技术ActiveX,这就是一种在客户端执行程序的机制,还有像早期Java语言开发的Applet,Applet是Java开发的小程序,这个小程序须要在JVM(JVM是虚拟一个Java的运行沙箱,一个盒子,其中可以运行Java程序,Java须要独特的运行时环境,须要装载Java所须要的类、库等等,还须要管理Java的生命周期,因此这是一个独特的专门用来管理Java程序的一种虚拟化的环境)上运行,Applet可以让Web程序员开发出一个小程序,这个小程序直接放在Web服务器站点的目录当中,然后客户端能够直接访问这个小程序,把这个小程序下载至本地,并在本地的Java虚拟机中运行。因此得为浏览器安装JVM插件,但在客户端运行程序是不安全的,好在Java的程序只能在JVM中运行,若是破坏的话,破坏的在很大程度上也是JVM自己。但Applet仍是要求在客户端安装一个插件进行配置,因此这对客户端提出了较高的要求,这对众多的用户来讲是不可忍受的。由此,逐渐的把程序的运行机制返回至服务器端。shell
服务器端动态:数据库
CGI:让服务器可以执行程序的技术,CGI是一种协议,它可以让Web服务器进程根据那个对应的程序的不一样调用对应的执行环境来运行那个对应的程序的文件,而且可以让程序的文件的运行结果从新取回至Web进程,这种协议就是CGI。其实任何语言都是能够开发动态网站的,而有些语言相比较来讲,更适合开发Web应用程序(webapp,指的是在服务器运行的Web程序,这个程序在客户端访问这个页面的时候不是直接返回给客户端的,而是如今服务器端调用对应的执行程序执行后将结果格式化成HTML文档返回给客户端的)。express
编程语言:apache
静态语言(编译型语言):(静态语言是强类型的,并且通常来说只有先编译才能运行)
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 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缓存器)。
1、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性能的改进。
2、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。
3、PHP的Opcode
Opcode是一种PHP脚本编译后的中间语言,就像Java的ByteCode,或者.NET的MSL。PHP执行PHP脚本代码通常会通过以下4个步骤(确切的来讲,应该是PHP的语言引擎Zend):
一、Scanning(Lexing) —— 将PHP代码转换为语言片断(Tokens)(即词法分析(词法扫描))
二、Parsing —— 将Tokens转换成简单而有意义的表达式(语法分析,Parsing与parse是两码事,如把数值赋值成变量的过程,通常来说是在这完成)
三、Compilation —— 将表达式编译成Opocdes
四、Execution —— 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能
4、php的加速器
基于PHP的特殊扩展机制如opcode缓存扩展也能够将opcode缓存于php的共享内存中,从而可让同一段代码的后续重复执行时跳过编译阶段以提升性能。由此也能够看出,这些加速器并不是真正提升了opcode的运行速度,而仅是经过分析opcode后并将它们从新排列以达到快速执行的目的。
常见的php加速器有:
一、APC (Alternative PHP Cache)
遵循PHP License的开源框架,PHP opcode缓存加速器,目前的版本不适用于PHP 5.4。项目地址,http://pecl.php.net/package/APC。
二、eAccelerator
源于Turck MMCache,早期的版本包含了一个PHP encoder和PHP loader,目前encoder已经不在支持。项目地址, http://eaccelerator.net/。
三、XCache
快速并且稳定的PHP opcode缓存,通过严格测试且被大量用于生产环境。项目地址,http://xcache.lighttpd.net/
四、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加密了。)
五、NuSphere PhpExpress
NuSphere的一款开源PHP加速器,它支持装载经过NuSphere PHP Encoder编码的PHP程序文件,并可以实现对常规PHP文件的执行加速。项目地址,http://www.nusphere.com/products/phpexpress.htm
(做为运维未来对到公司工做的时候,维护的颇有可能维护的就是一个PHP服务器或JSP服务器,因此上述内容必定要弄清楚,理解这段原理未来才能知道怎么去优化服务器的执行的,为何要装xcache?它到底在多大程度上起到了加速做用,怎么去调整xcache的性能,创建了一个缓存,它确定有一个缓存空间,缓存空间有多大,缓存中的条目应该缓存多长时间,有效期怎么去管理,这一切都是跟PHP自己基本原理相关的,配置很简单,理解有点困难,必定要把原理搞清楚)
5、PHP源码目录结构
PHP的源码在结构上很是清晰。其代码根目录中主要包含了一些说明文件以及设计方案,并提供了以下子目录:
一、build —— 顾名思义,这里主要放置一些跟源码编译相关的文件,好比开始构建以前的buildconf脚本及一些检查环境的脚本等。
二、ext —— 官方的扩展目录,包括了绝大多数PHP的函数的定义和实现,如array系列,pdo系列,spl系列等函数的实现。 我的开发的扩展在测试时也能够放到这个目录,以方便测试等。(PHP支持众多的扩展,如PHP可以使用一些加密库处理用户数据的时候进行加密等等)
三、main —— 这里存放的就是PHP最为核心的文件了,是实现PHP的基础设施,这里和Zend引擎不同,Zend引擎主要实现语言最核心的语言运行环境。
四、Zend —— Zend引擎的实现目录,好比脚本的词法语法解析,opcode的执行以及扩展机制的实现等等。
五、pear —— PHP 扩展与应用仓库,包含PEAR的核心文件。
六、sapi —— 包含了各类服务器抽象层的代码,例如apache的mod_php,cgi,fastcgi以及fpm等等接口。
七、TSRM —— PHP的线程安全是构建在TSRM库之上的,PHP实现中常见的*G宏一般是对TSRM的封装,TSRM(Thread Safe Resource Manager)线程安全资源管理器。
八、tests —— PHP的测试脚本集合,包含PHP各项功能的测试文件。
九、win32 —— 这个目录主要包括Windows平台相关的一些实现,好比sokcet的实如今Windows下和*Nix平台就不太同样,同时也包括了Windows下编译PHP相关的脚本。
PHP官方站点:www.php.net
下载源程序后,须要解压、编译才能运行,PHP虽然是一种解释型语言,但PHP自己确实须要编译才能运行的程序,就像bash同样,bash开发的脚本都是脚本,但bash自己确是二进制程序。
PHP既然是可以开发webapp的一种开发语言,这种语言只有在PHP的解释器中须要zend Engine编译后才能执行,但编译结果如何可以跟Apache的服务器结合起来?
CGI:Common 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访问,它最后一样要转换成数据流(0、1代码),数据流要经过网线发给客户端。由此,既然PHP解释器直接返回的是数据流,Apache直接把数据流响应给客户端便可。
对于一个网页文件(HTML)而言是有格式的,如:
可是写一个bash脚本test.sh,内容以下:
这个程序的执行结果并非HTML格式的文档,所以浏览器最后显示为纯文本了。但这些纯文本信息的显示对用户体验并不友好。由此应该以HTML格式显示给用户。如何可以为纯文本生成HTML格式的标签呢?
从上图可看出当前Apache是支持cgi的。
而若要支持CGI还须要找到另一个指令:ScriptAlias,用来定义在哪一个目录中执行脚本的:
/cgi-bin/:访问路径(URL或Alias);
/var/www/cgi-bin/:访问的目录;
所以到/var/www/cgi-bin/目录下写一个脚本:
从上图能够看出,直接访问这个脚本,没法执行,由于Apache理解不了这个脚本。
再看test.sh:
这个脚本是能够执行的。
修改:
因此脚本自身所处理的数据的结果,这个数据自己都是纯ASCII码,它是一些纯文本流,这些纯文本流应该格式化成在网页上显示起来更方便查看的HTML格式的文档。
可是当之后代码修改时,对应的由标签组成的架构也须要修改,这是很是麻烦的,所以须要将数据处理的逻辑与框架分离,最后经过某种方式将它们拼合起来,这种机制称为MVC,也能够叫作嵌入式开发语言。
推荐书籍:《大话设计模式》
那么Web服务器如何与PHP交互?
基于CGI的模式,Apache进程若是发现客户端访问了PHP页面,它会调用PHP解释器解释器执行这段程序,既然是执行代码的程序就会启动一个进程生成一个新进程,一旦执行结束之后这个进程即被销毁。但若是用户访问的程序既有1.php又有2.php,3.php,它是开三个进程,仍是一个进程访问3个页面呢?假如1调用2,2调用3,只须要一个进程便可,但若是说各自独立调用须要启动3个进程,这些进程何时启动何时结束由CGI控制,所以PHP解释器进程生命周期的管理也是由Apache管理的。
更重要的是,假如web服务器里面的众多的都是PHP页面,如200个PHP页面,3000静态内容(static content),若基于prefork模型,试想200个请求同时来访问PHP页面的时候(假设请求同时到达,不考虑静态),当前服务器上应该运行多少个进程呢?至少是400个,由于每个PHP也须要启动一个进程,因此基于这种模式进行处理的时候会发现它运行的进程会超出想象,若一个Apache进程须要2M,而一个PHP进程的大小则取决于数据和程序了,假如处理的数据比较大,一个进程10M,20M,50M都有可能,而http是一种无状态的协议(stateless),因此每个请求都是独立创建的,假如咱们尚未使用长链接,随时在线访问的进程都有200个那就意味着频繁的建立与销毁进程系统开销是很是大的,系统性能会显著下降的。
因此对于PHP来说,CGI这种机制并非一种优良的机制,对于大量用户并发来说尤为如此。所以将Web进程与CGI进程合二为一就简单多了,那么如何合二为一呢?Apache支持DSO(Dynamic Share Object,动态共享对象)机制,Apache有众多模块使用load moduling加载进来,不加载就不支持这个功能,要想使用这个功能加载进来就能够了。事实上,彻底能够实现将PHP作成Apache的一个动态共享模块的,将PHP编译成php_mod,当Apache用到时,直接将这个模块装载进来去解释PHP的内容便可。这也就意味着,在Apache进程内部就能本身装载进这个模块来完成对于PHP页面的加载而且可以将加载生成的结果不用再进行进程间通讯,直接转交给前端的处理程序便可。因此就使得就算有200个进程同时访问,也只须要启动200个进程处理便可。但有一缺陷就是Apache进程既要处理静态内容又要处理动态内容,虽然已经大大简化了cgi这种模式所具备的缺陷,但依然有着性能上的缺陷,尤为是200个用户而服务器最多容许250个请求同时进来,而假如说在峰值的并发时刻,已经有400个用户同时到来了,服务器不能应付全部状况了。此时就须要在加一台服务器了,并且基于Nginx两台A记录作负载均衡,用户的请求有的到第一个服务器上,有的到第二个服务器上,这样就简单许多了。但进程自己须要处理动态和静态内容,进程自己的过程会很复杂,使得整个服务器的改进会变得很是困难,由此就有了第三种让PHP和Apache结合的模式,就是让Apache的静态内容处理和动态内容处理相分离。虽然这同CGI同样,是使用不一样的进程完成的,但不一样的是CGI是在用户请求时由Apache临时建立CGI进程的。由此咱们能够安装一个PHP服务器,自身能够向Apache的prefork同样,事先生成不少空闲进程,不须要Apache管理,何时销毁这个进程、何时生成这个进程,由这个服务器自我管理。前端的Apache进程须要用到PHP功能了,只须要向服务器发送请求,服务器找一个空闲进程分配给它响应便可,当分配给Apache的进程执行结束,这个进程被服务器收回来,由服务器自我管理销毁,此时Apache或后端服务器的通讯就再也不是CGI了。能够理解成是基于另一种独立的服务器客户端之间的协议,这个时候Apache服务器是客户端,PHP是服务器,这种机制称为FastCGI。相似于刚才解释的这种机制,在PHP5.4中已经自带了这种功能,叫fpm(fast php module,快速功能模块)。
apache跟PHP结合的方式:
CGI
Module(最简单的方式)
FastCGI(当然性能比较好,但配置较麻烦)
注意:若Apache仅提供静态功能的话,Nginx性能(处理静态内容时)则比Apache好的多,因此使用fastcgi时一般使用Nginx+fpm。有些时候可能须要依赖于Apache某些模块,此时就须要使用Apache了。
配置Web服务器使用PHP的功能
(php5.3.3不支持fpm,php5.3.4才支持)
php-mbstring:(Multi Byte)对国际化的支持
查看安装php生成的功能:
Apache基于prefork或worker模型时,它们所依赖php的模块是不一样的。
AddHandler:添加一个处理器,如果一个以.php结尾的文件的话,就使用php5-script工具处理。php5-script这是Apache内置的一种处理机制,可以实如今内部完成怎么去识别这种文件的。
AddType:添加类别,text/html,多媒体类型,能将.php识别成纯文本格式,固然须要先执行的。
DirectoryIndex:定义默认的主页面;
phpinfo(); #php内置函数,可以以Web页面的方式显示服务器内部信息;
php配置文件:/etc/php.ini
配置文件格式如:
每一段的标识的配置只对对应段生效,称为分段式的配置。由于php的模块不少,每个模块使用的指令可能都不同,因此分为全局的,对每个模块都生效的,还有局部的,对每个特定模块生效的。
注意:.ini配置文件使用";"做为注释符;
由此,php就能直接工做了!!!