欢迎您的光临,本博所发布之文章皆为作者亲测通过,如有错误,欢迎通过各种方式指正。由于本站位于香港虚拟主机,故速度比较慢。

文摘  CGI,FastCGI,PHP-CGI与PHP-FPM 各公共网关接口介绍

PHP工具扩展 网络 247 0评论

1.CGI

CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。


浏览器请求web服务器如nginx,如果请求的是静态的index.html,则nginx可以直接返回。但是如果请求的是idex.php,nginx根据配置发现不是静态资源,需要请求后端的服务。那么,nginx在请求后端服务时,需要以什么样的格式、发送给后端服务什么样的数据呢?CGI就是定义格式、数据的协议。


CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如php,perl,tcl等。


CGI的特点:

CGI 是Web 服务器运行时外部程序的规范标准(一种协议),按CGI 编写的程序可以扩展服务器功能。

CGI应用程序是独立于服务器的,所以说几乎所有服务器都支持CGI,可用任何语言编写实现CGI(只要这种语言具有标准输入、输出和环境变量)。

CGI是外部应用程序(CGI程序)与WEB服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的过程。

工作流程:我们说Internet把用户请求送到web服务器->web服务器接收用户请求并交给CGI程序处理->CGI程序 把处理结果传送给web服务器->web服务器把结果送回到用户。

举个例子:

比如,用户请求index.html,那么web server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据。如果现在请求的是index.php,根据配置文件,nginx知道这个不是静态文件,需要去找PHP解释器来处理,那么他会把这个请求简单处理后交给PHP解释器。Nginx会传哪些数据给PHP解释器呢?url、查询字符串、POST数据、HTTP header等,那么CGI就是规定要传哪些数据、以什么样的格式传递给后方处理这个请求的协议。

当web server收到index.php这个请求后,会启动对应的CGI程序,这里就是PHP的解释器。接下来PHP解释器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程。web server再把结果返回给浏览器。


CGI协议的缺点:

CGI协议每次在请求后端服务时都要启动实现CGI协议的程序,这里就是PHP解析器。PHP解析器会解析PHP.ini文件,进行初始化工作,处理请求、返回结果。每个请求都要重新初始化,工作太冗余。所以,FCGI应运而生。 

因为PHP是解释型语言,因此需要解释器去解释PHP代码。


2.FastCGI

CGI是第一个,可能仍然是得到最广泛使用的服务器扩展。它在服务器和众多的资源类型之间提供了一种简单的、函数形式的粘合方式,用来处理各种需要的转换。这个接口还能很好的保护服务器,防止一些糟糕的扩展对它造成的破坏。但是CGI也存在着非常大的缺陷,就是每当使用CGI的服务器接受得到一个请求都会开启一个新的CGI进程进行处理(PHP中需要重新解析php.ini,重新载入全部扩展并且初始化全部数据结构),这对服务器的性能有着极大的消耗。为了解决这个问题,就诞生了一种新型的CGI---FastCGI,FastCGI像是一个常驻型的CGI,是作为持久守护进程运行的,很好的解决了这个问题。


FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。它还支持分布式的运算,即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。


FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail- Over特性等等。


FastCGI特点

FastCGI具有语言无关性.

它还支持分布式的运算, 即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。

其主要行为是:将CGI解释器进程保持在内存中并因此获得较高的性能。

FastCGI在进程中的应用程序,独立于核心web服务器运行,提供了一个比API更安全的环境。APIs把应用程序的代码与核心的web服务器链接在一起,这意味着在一个错误的API的应用程序可能会损坏其他应用程序或核心服务器。 恶意的API的应用程序代码甚至可以窃取另一个应用程序或核心服务器的密钥。

FastCGI技术目前支持语言有:C/C++、Java、Perl、Tcl、Python、SmallTalk、Ruby等。相关模块在Apache, ISS, Lighttpd等流行的服务器上也是可用的。

FastCGI的不依赖于任何Web服务器的内部架构,因此即使服务器技术的变化, FastCGI依然稳定不变。


FastCGI的工作原理

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

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

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

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

在上述情况中,你可以想象CGI通常有多慢。每一个Web请求PHP都必须重新解析php.ini、重新载入全部扩展并重初始化全部数据结构。使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的好处是,持续数据库连接(Persistent database connection)可以工作。


FastCGI的优点:

FCGI协议首先启动一个master,master用来解析PHP.ini文件,进行初始化工作。启动多个worker,worker用来处理具体的请求。这样将初始化和处理具体的请求就分离了。这样也就需要一个程序来管理master和worker,所以PHP-FPM就出现了。

FCGI采用C/S架构。将web服务器与脚本解析服务器分离开来。使得web服务器只处理静态资源和将后端脚本解析服务器返回的数据返回给浏览器。

web服务器nginx不支持对外部程序如PHP程序的直接调用或者解析,因此必须通过CGI接口来调用。这是其实需要将CGI进行一个封装,形成一个wrapper,其实就是PHP-FPM。nginx调用PHP-FPM,PHP-FPM再调用后端的PHP代码,然后PHP-FPM返回结果给nginx。

现在PHP-FPM已经被集成到PHP内核中。

PHP-FPM与nginx经常会部署在不同服务器上,以减轻前端nginx处理静态资源,转发动态请求的压力。

而且FCGI也比CGI要安全。


FastCGI的不足

因为是多进程,所以比CGI多线程消耗更多的服务器内存,PHP-CGI解释器每进程消耗7至25兆内存,将这个数字乘以50或100就是很大的内存数。


Nginx 0.8.46+PHP 5.2.14(FastCGI)服务器在3万并发连接下,开启的10个Nginx进程消耗150M内存(15M*10=150M),开启的64个php-cgi进程消耗1280M内存(20M*64=1280M),加上系统自身消耗的内存,总共消耗不到2GB内存。如果服务器内存较小,完全可以只开启25个php-cgi进程,这样php-cgi消耗的总内存数才500M。

上面的数据摘自Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器(第6版)


3.PHP-CGI

PHP-CGI是PHP自带的FastCGI管理器。


PHP-CGI的不足:

php-cgi变更php.ini配置后需重启php-cgi才能让新的php-ini生效,不可以平滑重启。

直接杀死php-cgi进程,php就不能运行了。(PHP-FPM和Spawn-FCGI就没有这个问题,守护进程会平滑从新生成新的子进程。)


4.PHP-FPM

PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的,可以在 http://php-fpm.org/download  下载得到。


PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用。


现在我们可以在最新的PHP 5.3.2的源码树里下载得到直接整合了PHP-FPM的分支,据说下个版本会融合进PHP的主分支去。相对Spawn-FCGI,PHP-FPM在CPU和内存方面的控制都更胜一筹,而且前者很容易崩溃,必须用crontab进行监控,而PHP-FPM则没有这种烦恼。


PHP5.3.3已经集成php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多有点,所以被PHP官方收录了。在./configure的时候带 –enable-fpm参数即可开启PHP-FPM。


5.Spawn-FCGI

Spawn-FCGI是一个通用的FastCGI管理服务器,它是lighttpd中的一部份,很多人都用Lighttpd的Spawn-FCGI进行FastCGI模式下的管理工作,不过有不少缺点。而PHP-FPM的出现多少缓解了一些问题,但PHP-FPM有个缺点就是要重新编译,这对于一些已经运行的环境可能有不小的风险(refer),在php 5.3.3中可以直接使用PHP-FPM了。


Spawn-FCGI目前已经独成为一个项目,更加稳定一些,也给很多Web 站点的配置带来便利。已经有不少站点将它与nginx搭配来解决动态网页。


最新的lighttpd也没有包含这一块了(http://www.lighttpd.net/search?q=Spawn-FCGI  ),但可以在以前版本中找到它。在lighttpd-1.4.15版本中就包含了(http://www.lighttpd.net/download/lighttpd-1.4.15.tar.gz  ),目前Spawn-FCGI的下载地址是http://redmine.lighttpd.net/projects/spawn-fcgi  ,最新版本是http://www.lighttpd.net/download/spawn-fcgi-1.6.3.tar.gz  。


注:最新的Spawn-FCGI可以到lighttpd.net网站搜索“Spawn-FCGI”找到它的最新版本发布地址。


6.PHP-FPM与spawn-CGI对比

PHP-FPM的使用非常方便,配置都是在PHP-FPM.ini的文件内,而启动、重启都可以从php/sbin/PHP-FPM中进行。更方便的是修改php.ini后可以直接使用PHP-FPM reload进行加载,无需杀掉进程就可以完成php.ini的修改加载

结果显示使用PHP-FPM可以使php有不小的性能提升。PHP-FPM控制的进程cpu回收的速度比较慢,内存分配的很均匀。

Spawn-FCGI控制的进程CPU下降的很快,而内存分配的比较不均匀。有很多进程似乎未分配到,而另外一些却占用很高。可能是由于进程任务分配的不均匀导致的。而这也导致了总体响应速度的下降。而PHP-FPM合理的分配,导致总体响应的提到以及任务的平均。


参考链接:

http://www.cnblogs.com/JohnABC/p/3529786.html 

https://segmentfault.com/q/1010000000256516 

http://www.cleey.com/blog/single/id/848.html 

http://m.blog.csdn.net/article/details?id=8740914 


原文地址:https://www.cnblogs.com/Alight/p/4709090.html

转载请注明: ITTXX.CN--分享互联网 » CGI,FastCGI,PHP-CGI与PHP-FPM 各公共网关接口介绍

最后更新:2018-10-11 18:54:43

赞 (0) or 分享 ()
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽