PHP根蒂根基 CGI,FastCGI,PHP-CGI与PHP-FPM

    添加时间:2013-7-11 点击量:

    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特点



    1. FastCGI具有说话无关性.

    2. FastCGI在过程中的应用法度,自力于核心web办事器运行,供给了一个比API更安然的景象。APIs把应用法度的代码与核心的web办事器链接在一路,这意味着在一个错误的API的应用法度可能会破坏其他应用法度或核心办事器。 恶意的API的应用法度代码甚至可以窃取另一个应用法度或核心办事器的密钥。

    3. FastCGI技巧今朝支撑说话有:C/C++、Java、Perl、Tcl、Python、SmallTalk、Ruby等。相干模块在Apache, ISS, Lighttpd等风行的办事器上也是可用的。

    4. 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内存(15M10=150M),开启的64个php-cgi过程消费1280M内存(20M64=1280M),加上体系自身消费的内存,统共消费不到2GB内存。若是办事器内存较小,完全可以只开启25个php-cgi过程,如许php-cgi消费的总内存数才500M。
    上方的数据摘自Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web办事器


    PHP-CGI


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


    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。


    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


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


    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公道的分派,导致总体响应的提到以及任务的均匀。

    原来,再大的房子,再大的床,没有相爱的人陪伴,都只是冰冷的物质。而如果身边有爱人陪伴,即使房子小,床小,也觉得无关紧要,因为这些物质上面有了爱的温度,成了家的元素。—— 何珞《婚房》#书摘#
    分享到: