彻底明白php中cgi、fastcgi和php-cgi、php-fpm及php运行原理

目录

1.CGI

2.FastCGI

3.PHP-CGI

4.PHP-FPM

5.PHP运行原理

1)mod_php模式

2)mod_fastcgi 模式

3)总结:


1.CGI

最早的Web服务器只处理静态的html文件。随着技术的不断发展,网站越来越复杂,然后出现到动态网站,但是服务器并不能直接运行php,asp这个的动态语言文件,然后出现了cgi,cgi只是接口协议

CGI(Common Gateway Interface)全称是“通用网关接口”,它是Web服务器与外部应用程序(CGI程序)之间传递信息的接口标准。通过CGI接口,Web服务器就能够获取客户端提交的信息,并转交给服务器端的CGI程序处理,最后返回结果给客户端。CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如php、perl、tcl等。

web服务器接受到请求,然后根据内容,fork一个新进程,这个进程会把处理完的数据返回给web服务器,最后web服务器把内容发送给用户,刚才fork的进程也随之退出,如果下次用户还请求改动态脚本,那么web服务器又再次fork一个新进程。

比如,如果请求/index.html,那么Web Server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据。

如果现在请求的是/index.php,根据配置文件,Web Server知道这个不是静态文件,需要去找PHP解析器来处理,那么他会把这个请求简单处理后交给PHP解析器。WEB服务器会传哪些数据给PHP解析器呢? URL、查询字符串、POST数据、HTTP header都会有,所以,CGI就是规定要传哪些数据、以什么样的格式传递给后方处理这个请求的协议。当Web Server收到/index.php这个请求后,会启动对应的CGI程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程。web server再把结果返回给浏览器。

也就是说,CGI实际上是一个接口标准。我们通常所说的CGI是指CGI程序,即实现了CGI接口标准的程序

CGI的好处:完全独立于任何服务器,仅仅是做为中间分子。提供接口给Web Server和php。他们通过CGI搭线来完成数据传递。这样做的好处了尽量减少2个的关联,使他们2变得更独立。

CGI的不足:每一次web请求都会有启动和退出过程,也就是最为人诟病的fork-and-execute模式,这样一在大规模并发下,就死翘翘了。

2.FastCGI

Fastcgi是cgi的升级版,是用来提高CGI程序性能的(也是一种协议)。

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

FastCGI是与语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因。

FastCGI是一种进程管理工具,它可以在内存中管理CGI进程。

FastCGI进程管理器需要单独启动。启动FastCGI后,会生成一个FastCGI主进程和多个子进程(子进程其实就是CGI解释器进程)。

当客户端请求Web服务器上的动态脚本时,Web服务器会将动态脚本通过TCP协议交给FastCGI主进程,FastCGI主进程根据情况,安排一个空闲的子进程来解析动态脚本,处理完成后将结果返回给Web服务器,Web服务器再将结果返回给客户端。该客户端请求处理完毕后,FastCGI子进程并不会随之关闭,而是继续等待主进程安排工作任务。

FastCGI的好处:工作效率是非常高的。

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

3.PHP-CGI

PHP-CGI是PHP自带的FastCGI管理器。是一个实现了CGI协议的程序,用来解释PHP脚本的程序。

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的。它是一个实现了FastCGI协议的程序。

也就是说,PHP-FPM 是对于 FastCGI 协议的具体实现,它负责管理一个进程池,来处理来自Web服务器的请求。目前,PHP5.3版本之后,PHP-FPM是内置于PHP的

因为PHP-CGI只是个CGI程序,它自己本身只能解析请求,返回结果,不会进程管理,所以就出现了一些能够调度PHP-CGI进程的程序,比如说由lighthttpd分离出来的spawn-fcgi。同样,PHP-FPM也是用于调度管理PHP解析器PHP-CGI的管理程序。

PHP-FPM通过生成新的子进程可以实现php.ini修改后的平滑重启。

5.PHP运行原理

php是为web而生的一门后端语言,那么它就必须借助于web服务器,才能提供web功能。当然其他的后端语言如果做web应用,也必须借助于web服务器。常见的web服务器有:Apache、nginx、IIS、lighttpd、tomcat。作为一名phper,最熟悉的当然是Apache、nginx了。

如果客户端请求的是 index.html,那么Web Server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据。

如果请求的是 index.php动态数据,PHP和web服务器又是怎么勾搭上的呢?两种模式

1)mod_php模式

以 Apache 为例,在PHP Module方式中,是不是在 Apache 的配置文件 httpd.conf 中加上这样几句:

//加入以下2句
LoadModule php5_module D:/php/php5apache2_2.dll
AddType application/x-httpd-php .php
//将下面的
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>
//将其修改为:
<IfModule dir_module>
    DirectoryIndex index.html index.htm index.php index.phtml
</IfModule>

上面的windows下安装php和Apache环境后的手动配置,在linux下源码安装大致是这样配置的:

./configure --with-mysql=/usr/local --with-apache=/usr/local/apache --enable-track-vars 

这种方式,他们的共同本质都是用LoadModule来加载php5_module,就是把php作为Apache的一个子模块来运行。当通过web访问php文件时,Apache就会调用php5_module来解析php代码。

那么php5_module是怎么来将数据传给php解析器来解析php代码的呢?答案是通过sapi

从上面图中,我们看出了sapi就是这样的一个中间过程,SAPI提供了一个和外部通信的接口,有点类似于socket,使得PHP可以和其他应用进行交互数据(apache,nginx等)。php默认提供了很多种SAPI,常见的提供给apache和nginx的php5_module、CGI、FastCGI,给IIS的ISAPI,以及Shell的CLI。

所以,以上的apache调用php执行的过程如下:

apache -> httpd -> php5_module -> sapi -> php

好了。apache与php通过php5_module的方式就搞清楚了吧!我们把这种运行方式叫做mod_php模式。

这种模式将php模块安装到apache中,所以每一次apache结束请求,都会产生一条进程,这个进程就完整的包括php的各种运算计算等操作。

在上图中,我们很清晰的可以看到,apache每接收一个请求,都会产生一个进程来连接php通过sapi来完成请求,可想而知,如果一旦用户过多,并发数过多,服务器就会承受不住了。

而且,把mod_php编进apache时,出问题时很难定位是php的问题还是apache的问题。

2)mod_fastcgi 模式

上面也说到了sapi,sapi是php提供的统一接口,它提供给了php5_module和cgi等方式供web服务器来链接和解析php代码。上面讲到的php5_module加载模式,我们称之为mod_php模式。

mod_fastcgi模式则刚刚相反,fastcgi是一个独立与apache和php的独立个体,它随着apache一起启动,生成多个cig模块,等着apache的请求:

图中fastcgi早早的启动好了,静静的在哪里等着,已有apache发来的httpd请求就立马接收过来,通过调用sapi给php,完成运算。而且不会退出。这样就能应对大规模的并发请求,因为web server的要做的事情少了,所以就更快的去处理下一个请求,这样并发大大的。

由于apache 与 php 独立了。出问题,很好定位到底是哪里出问题了。这点也是这种模式受欢迎的原因之一。

PHP-CGI就是PHP实现的自带的FastCGI管理器。 虽然是php官方出品,但是这丫的却一点也不给力,性能太差,而且也很麻烦不人性化,主要体现在:

  1. php-cgi变更php.ini配置后,需重启php-cgi才能让新的php-ini生效,不可以平滑重启。
  2. 直接杀死php-cgi进程,php就不能运行了。

 上面2个问题,一直让很多人病垢了很久,所以很多人一直还是在用 Module 方式。 直到 2004年一个叫 Andrei Nigmatulin的屌丝发明了PHP-FPM ,这神器的出现就彻底打破了这种局面,这是一个PHP专用的 fastcgi 管理器,它很爽的克服了上面2个问题,而且,还表现在其他方面更表现强劲。

3)总结:

最后总结一下,直接上图:

所以,如果要搭建一个高性能的PHP WEB服务器,目前最佳的方式是Apache/Nginx + FastCGI + PHP-FPM(+PHP-CGI)方式了,不要再使用 Module加载或者 CGI 方式啦:)

参考:

https://www.awaimai.com/371.html

https://www.zybuluo.com/phper/note/50231

https://www.awaimai.com/371.html

 

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值