Common Gateway Interface【转】搞清FastCgi与PHP-fpm之间的干。

CGI(一个商量)
是web服务器和标应用程序(cgi程序)之间的接口标准,是cgi程序与web服务器之间传递信息的回程。

同等、问题:网上有说,fastcgi是一个协议,php-fpm实现了这个协议;
有的游说,php-fpm是fastcgi进程的管理器,用来管理fastcgi进程的;
有的说,php-fpm是php内核的一个补丁;
有的说,修改了php.ini配置文件后,没道平滑重开,所以即便生了php-fpm;
还有些说PHP-CGI是PHP自带的FastCGI管理器

cgi

  首先,CGI是干嘛的?CGI是为了保web
server传递过来的数额是正统格式的,方便CGI程序的编辑。

当情理及是平等截先后,运行于服务器上,提供和客户端HTML页面的接口。这样说盖还不好理解。那么我们看一个实际上例子:现在之个人主页上绝大多数且发一个留言本。留言本的工作是这么的:先由用户在客户端输入有音,如名字之类的物。接着用户按一下“留言”(到目前为止工作都以客户端),浏览器把这些信传递到服务器的CGI目录下一定的cgi程序中,于是cgi程序于服务器上本预定的方进行处理。在本例中便是管用户提交的音讯存入指定的文件被。然后cgi程序让客户端发送一个信,表示要的任务现已终结。此时用户在浏览器里用张“留言结束”的字样。整个经过结束。

  web
server(比如说nginx)只是情之分发者。比如,如果要/index.html,那么web
server会去文件系统中找到这文件,发送给浏览器,这里分发的是静态数据。好了,如果现在恳请的是/index.php
根据配置文件,nginx知道此不是静态文件,需要去找寻PHP解析器来拍卖,那么他会晤拿此请简单处理后交PHP解析器。Nginx会传哪些数据为
PHP解析器呢?url要来吧,查询字符串也得生吧,POST数据也要是发生,HTTP
header不克少吧,好的,CGI就是规定而招哪些数据、以安的格式传递给后方处理这要的说道。仔细思量,你当PHP代码中使的用户从乌来的。当web
server收到/index.php是请后,会启动相应之CGI程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理要,再因确定CGI规定的格式返回处理后底结果,退出过程。web
server再管结果回到给浏览器。

拍卖步骤:

⑴通过Internet把用户请求送及web服务器。

⑵web服务器收到用户请求并提交CGI程序处理。

⑶CGI程序把处理结果传送给web服务器。

⑷web服务器将结果送返用户。

  好了,CGI是独协议,跟进程什么的没什么。那fastcgi又是呀吧?Fastcgi是故来增长CGI程序性能的。

  提高性,那么CGI程序的特性问题在哪呢?”PHP解析器会解析php.ini文件,初始化执行环境”,就是这里了。标准的CGI对每个请求都见面执行及时
把步骤(不闲累啊!启动进程非常烦的说!),所以拍卖每个时间的时刻会于长。这明显不客观嘛!那么Fastcgi是怎开的呢?首先,Fastcgi会先
启一个master,解析配置文件,初始化执行环境,然后又起步多独worker。当呼吁过来时,master会传递给一个worker,然后马上可以接
受下一个呼吁。这样就算避免了再也的麻烦,效率自然是青出于蓝。而且当worker不够用时,master可以依据配置优先启动几个worker等正在;当然空闲
worker太多时,也会停少一部分,这样就是增长了性,也节了资源。这虽是fastcgi的指向过程的保管。

cgi程序是由用户之输入触发的,运行在web服务器上之次序。CGI是当HTTP服务器下运作外部程序(或网关)的一个接口,它能吃网络用户访问远程系统上之采取类程序,就类似他们在实际上应用那些远距离计算机一样。

  那PHP-FPM又是啊为?是一个兑现了Fastcgi的顺序,被PHP官方收了。大家都亮,PHP的解释器是php-cgi。php-cgi只是只CGI程序,他好我只能解析呼吁,返回结果,不见面经过管理(皇上,臣妾真的召开不交
啊!)所以就应运而生了一部分力所能及调度php-cgi进程的次序,比如说由lighthttpd分离出来的spawn-fcgi。好了PHP-FPM也是这般个
东东,在加上日子的前行后,逐渐取得了大家的认同(要掌握,前几乎年大家只是抱怨PHP-FPM稳定性太差的),也越发流行。

cgi

  好了,最后来回到你的问题。
  1、网上有说,fastcgi是一个说道,php-fpm实现了这个协议

工作规律:

1.浏览器通过HTML表单或超链接告对一个CGI应用程序的URL。

2.服务器收发到要。

3.服务器执行指定所CGI应用程序。

4.CGI应用程序执行所急需之操作,通常是冲浏览者输入的始末。

5.CGI应用程序把结果格式化为网络服务器跟浏览器会知情的文档(通常是HTML网页)。

6.网络服务器将结果返回到浏览器中。

最低水平,PHP可以举行另外其它CGI程序所能够举行的从,例如收集表格数据,生成动态页面情,或者收发cookies.可能最精,最有义之性状是PHP支持特别范围之数额库.书写一个支撑数据库的Web
页面是怀疑的简约。

  对。


 

FastCGI(一个商议)

CGI 的性质缺点:web server 得到一个request
后,会fork一个子过程,然后子进程执行cgi程序。这代表
如果N个请求并发访问同一cgi
程序,那么该次会吃伪装载入内存N次。cgi进程的再三加载造成了cgi的特性低下。

FastCGI
就是一个常驻型(long-live)的cgi。它的第一表现是用cgi解释器进程保存在内存中盖博得比高之习性。

工作原理:

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

2、FastCGI进程管理器自身初始化,启动多个CGI解释器经过(可见多单php-cgi)并伺机来自Web
Server的连。

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

4、FastCGI子进程就处理后拿标准输出以及错误信息从平连接返回Web
Server。当FastCGI子进程关闭连接时,请求便告处理完了。FastCGI子进程就等待并拍卖来自FastCGI进程管理器(运行于Web
Server中)的生一个连连。
在CGI模式面临,php-cgi于这个即退出了。

每当上述情况中,你可以想象CGI通常有多慢。每一个Web请求PHP都要再次分析php.ini、重新载入全部恢宏并重初始化全部数据结构。使用FastCGI,所有这些还单在经过启动时起同样次。一个附加的补是,持续数据库连接(Persistent
database connection)可以干活。


    2、有的说,php-fpm是fastcgi进程的管理器,用来管理fastcgi进程的

PHP-CGI(实现了FastCGI的程序)

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

PHP-CGI的不足:

php-cgi变更php.ini配置后要另行启php-cgi才能够给新的php-ini生效,不得以平滑重开。

直白杀死php-cgi进程,php就不可知运作了。(PHP-FPM和Spawn-FCGI就无此题目,守护进程会平滑从新兴成新的子进程。)


  对。php-fpm的管理对象是php-cgi。但切莫克说php-fpm是fastcgi进程的管理器,因为前面说了fastcgi是个商量,似乎没如此个经过在,就算在php-fpm也管理不了外(至少目前是)。
有的游说,php-fpm是php内核的一个补丁以前是对的。因为极度开始之时php-fpm没有包含在PHP内核里面,要运此职能,需要找到与源码版本一样之php-fpm对内核打补丁,然后再度编译。后来PHP内核集成了PHP-FPM之后虽有利于多矣,使用--enalbe-fpm其一编译参数即可。

PHP-FPM(实现了FastCGI的程序)

PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的。解决了php-cgi的一对题材。

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

CGI方式是每个请求fork一个子历程,然后再次销售毁.高频度的访下,频繁之fork产生额外的体系出,限制了拍卖能力,所以当apache下跑php一般都是内嵌模块的不二法门(mod_php)

话说CGI还有平等种植转移种FASTCGI, 为了化解CGI的这种缺陷,
大概是高达世纪90年代中期起了FASTCGI, 以常驻进程的法提供CGI服务,

一味是多以,apache有矣mod_perl,
mod_php等模块,性能一般比起优势,大家都好用这种艺术,
所以fastcgi没立马火起来。

 

  3、有的说,修改了php.ini配置文件后,没道平滑重开,所以就算生了php-fpm

  是的,修改php.ini之后,php-cgi进程的确是从未道平滑重开的。php-fpm对这之处理机制是新的worker用新的布,已经存在的worker处理完毕手上的活虽得歇着了,通过这种机制来平滑过度。

 

  4、还片说PHP-CGI是PHP自带的FastCGI管理器,那这样的话干呢而且打个php-fpm出

  不针对。php-cgi只是解说PHP脚本的次第而已。

—————————–补充————————————–

二、什么是CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI?

  什么是CGI

  CGI全称是“公共网关接口”(Common Gateway
Interface),HTTP服务器和汝的还是另机器及之次第进行“交谈”的同一栽工具,其程序必须运行在网络服务器上。CGI可以就此另外一样栽语言编写,只要这种语言有专业输入、输出及环境变量。如php,perl,tcl等

  什么是FastCGI

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

  FastCGI是言语无关的、可伸缩架构的CGI开放扩展,其重点作为是用CGI解释器进程保持在内存中连据此收获比较高之特性。众所周知,CGI解释器的勤加载是CGI性能低下的重要缘由,如果CGI解释器保持以内存中连接受FastCGI进程管理器调度,则可供优秀的性能、伸缩性、Fail-
Over特性等等。

  FastCGI与CGI特点

  1、如CGI,FastCGI也有所语言无关性.

  2、如CGI,
FastCGI在经过中之应用程序,独立为核心web服务器运行,提供了一个比API更安全的条件。(APIs把应用程序的代码和主导的web服务器链接以并,这代表在一个破绽百出的API的应用程序可能会见摔其他应用程序或骨干服务器;
恶意的API的应用程序代码甚至可以窃取另一个应用程序或骨干服务器的密钥。)

  3、FastCGI技术时支撑语言来:C/C++、Java、Perl、Tcl、Python、SmallTalk、Ruby等。相关模块于Apache,
ISS, Lighttpd等风靡的服务器上啊是可用的。

  4、如CGI,FastCGI的免依赖让其它Web服务器的其中架构,因此尽管服务器技术的变化,
FastCGI依然祥和不转移。

  FastCGI的工作规律
  1、Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache
Module)
  2、FastCGI进程管理器自身初始化,启动多单CGI解释器进程(可见多只php-cgi)并听候来自Web
Server的连续。
  3、当客户端请求到达Web
Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web
server将CGI环境变量和规范输入发送到FastCGI子进程php-cgi。
  4、FastCGI子进程就处理后用标准输出以及错误信息从平连接返回Web
Server。当FastCGI子进程关闭连接时,请求便告处理到位。FastCGI子进程就等待并处理来自FastCGI进程管理器(运行在Web
Server中)的下一个连。 在CGI模式面临,php-cgi在是便脱离了。
  于上述情况中,你得想像CGI通常有多慢。每一个Web请求PHP都须另行分析php.ini、重新载入全部恢弘并重初始化全部数据结构。使用FastCGI,所有这些还止以经过启动时发生同样不良。一个附加的好处是,持续数据库连接(Persistent
database connection)可以干活。

  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版本)】

  什么是PHP-CGI

  PHP-CGI是PHP自带的FastCGI管理器。启动PHP-CGI,使用如下命令:php-cgi -b 127.0.0.1:9000

  PHP-CGI的不足

  1、php-cgi变更php.ini配置后需要更启php-cgi才会给新的php-ini生效,不得以平滑重开

  2、直接杀死php-cgi进程,php就不克运作了。(PHP-FPM和Spawn-FCGI就从未有过此题材,守护进程会平滑从新兴成新的子进程。)

  什么是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。使用PHP-FPM来控制PHP-CGI的FastCGI进程

1 /usr/local/php/sbin/php-fpm{start|stop|quit|restart|reload|logrotate}
2 
3 --start 启动php的fastcgi进程
4 --stop 强制终止php的fastcgi进程
5 --quit 平滑终止php的fastcgi进程
6 --restart 重启php的fastcgi进程
7 --reload 重新平滑加载php的php.ini
8 --logrotate 重新启用log文件 

  什么是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”找到她的风靡版本发布地点

  下面我们就算可下Spawn-FCGI来控制php-CGI的FastCGI进程了

1 /usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u www-data -g www-data -f /usr/bin/php-CGI

  参数含义如下:

  -f
指定调用FastCGI的长河的行顺序位置,根据系统及所作的PHP的景象具体装
  -a 绑定到地方addr
  -p 绑定到端口port
  -s 绑定到unix socket的路径path
  -C 指定出的FastCGI的经过数,默认为5(仅用于PHP)
  -P 指定出的进程的PID文件路径
  -u和-g FastCGI使用什么地位(-u 用户 -g
用户组)运行,Ubuntu下可以使用www-data,其他的基于气象部署,如nobody、apache等

  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合理的分红,导致整体响应的关联与任务的平分。

  PHP-FPM与Spawn-FCGI功能于

  http://php-fpm.org/about/

  PHP-FPM、Spawn-FCGI都是医护php-cgi的历程管理器。

  参考文档:

  http://topic.csdn.net/u/20100216/22/5809e272-6f67-4248-bde9-99deeae5215b.html
  http://topic.csdn.net/u/20101015/19/8ae74452-ec6b-448e-9942-21faeb008cd7.html
  http://club.topsage.com/thread-768488-1-1.html
  http://www.unixaid.info/index.php/productsapp/23-servsf/842-spawn-fcgi
  http://www.fastcgi.com/drupal/node/2
  http://baike.baidu.com/view/641394.htm
  http://baike.baidu.com/view/32614.htm
  http://blog.yation.com/network/fastcgi/

 

注意:

本文非原创内容,为了珍惜别人劳动,转载请到文章原文地址:

https://segmentfault.com/q/1010000000256516

http://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注