龙空技术网

Php与Apache的三种结合方式以及各自优缺点

名牛云 321

前言:

此刻大家对“php配置到apache”大体比较讲究,朋友们都需要剖析一些“php配置到apache”的相关资讯。那么小编也在网络上网罗了一些对于“php配置到apache””的相关资讯,希望大家能喜欢,各位老铁们一起来了解一下吧!

httpd与php的结合方式:

如果网站的访问量很小,同一时间仅仅处理单个请求,那么各种结合方式的特点并不能很好的体现。这里我们仅考虑在高访问量、高并发情况下各种结合方式的优缺点。

CGI:

CGI(common gateway interface)通常翻译为共同网关接口,是HTTP服务器与机器上的其他程序进行通信的一个接口,让Web服务器必要时启动额外的程序处理动态内容。CGI是一种协议,它定义了Webserver与CGI程序的通信方式。Webserver接受客户端的HTTP请求,然后建立进程执行CGI程序,客户端的请求被传递给CGI程序,CGI执行后结果再返回Webserver。 CGI的出现让WEB从静态变为为动态,随着Web的越来越普及,很多的网站的都需要有动态的页面,以便与浏览者互交。随着网络技术的发展,CGI方式的缺点也越来越突出。每次客户端请求都需要建立和销毁进程。因为HTTP要生成一个动态页面,系统就必须启动一个新的进程以运行CGI程序,不断地fork是一项很消耗时间和资源的工作。

FastCGI:

众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中 并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail-Over特性等等。

FastCGI是一个常驻型的CGI,可以一直执行,只要激活后,不会每次都花时间去fork一次,而且还支持分布式运算(使得php程序解释执行可以单独交给php服务器),即可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。

1、Web Server 启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module);

2、FastCGI进程管理器自身初始化,启动多个CGI解释器进程 (在任务管理器中可见多个php-cgi.exe)并等待来自Web Server的连接。

3、当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi.exe。

4、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在 WebServer中)的下一个连接。 在正常的CGI模式中,php-cgi.exe在此便退出了。

Module:

把php编译为apache的模块,就要考虑apache的MPM的工作模式。

首先我们要了解什么是MPM:

MPM:Multi Path Modules (多道处理模块)用于定义apache在响应多个用户请求时所工作的模型。有三种MPM模式:

prefork(一个请求一个进程响应)

worker(一个请求用一个线程响应,启动多个进程每个进程生成多个线程)

event(一个进程处理多个请求)

以模块安装的php没有独立的进程,是作为apache的模块和apache一起启动的。

以上三种MPM模式,worker模式会比prefork模式占据更少的内存,高并发下的表现更好。而且使用多进程和多线程混合模式,即使有一个线程挂了,也只影响和该线程同进程的其他线程,不会影响到其他的进程。但是如果有特别多的线程都使用keep-alive的长连接方式,则线程会一直被占据直到超时才释放,导致在高并发场景下无可用线程。而event模式使用了一个专门的线程来处理这些keep-alive类线程,较好的解决了这个问题。

比较:

以CGI方式运行PHP,由于CGI是非常驻内存集,每次Webserver接受客户端的HTTP请求,然后建立进程执行CGI程序,客户端的请求被传递给CGI程序,CGI执行后结果再返回Webserver。 每次浏览页面都要重复上面的动作,会有非常大的消耗。

以mod_php模式运行PHP,意味着php是作为apache的一个模块来启动的,因此只有在apache启动的时候会加载扩展模块,在apache运行期间是不会再去读取和加载扩展模块的。显然使用mod_php的方式运行PHP效率比CGI方式更高。

而mod_php与fastcgi相比,俩者都有进程池的概念,但是,fastcgi将服务器端动、静态请求更好的分离。php进程除了问题不会将web服务器也当掉。

最后再对几个名词进行解释:

php的解释器是php-cgi。php-cgi只是个CGI程序,只能解析请求,返回结果,不会进程管理,而php-fastcgi是php-cgi的升级版。php-fpm的功能就是能够调度php解释进程实现进程管理。

标签: #php配置到apache