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

by admin on 2018年10月5日

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

发表评论

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

网站地图xml地图