cgi,php-cgi

本文探讨了CGI、PHP的传统模块方式、FastCGI的工作原理及其与PHP-FPM的关系。PHP-FPM作为高效PHP-FastCGI管理器,解决了php-cgi的性能和管理问题,提升了Web服务器动态处理能力。
摘要由CSDN通过智能技术生成

cgi,php-cgi,fastcgi,php-fpm之间关系

所有的web服务器在设计之初,是为用户提供静态资源的。在整个网站架构中,Web Server(如Apache)只是内容的分发者。

web服务器升级过程

20181001143015253

module方式

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

# 加上以下2句
LoadModule php5_module D:/php/php5apache2_2.dll
AddType application/x-httpd-php .php

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

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

20181001142326317

从上图我们可以看出SAPI提供了一个和外部通信的接口,使得PHP可以和其他应用进行交互数据(apache,nginx等)

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

apache每接收一个请求,都会产生一个进程来连接php通过sapi来完成请求,可想而知,如果一旦用户过多,并发数过多,服务器就会承受不住了,而且把mod_php编进apache时,出问题时很难定位是php的问题还是apache的问题

CGI方式

是什么

CGI(Common Gateway Interface)全称是“通用网关接口”,WEB 服务器与PHP应用进行“交谈”的一种工具,其程序须运行在网络服务器上。CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如php、perl、tcl等。

CGI就是规定要传哪些数据,以什么样的格式传递给后方处理这个请求的协议

web服务器收到用户请求,就会把请求提交给cgi程序(如php-cgi),cgi程序根据请求提交的参数作应处理(解析php),然后输出标准的html语句,返回给web服服务器,WEB服务器再返回给客户端。

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

fastcgi方式

是什么

从根本上来说,FastCGI是用来提高CGI程序性能的。类似于CGI,FastCGI也可以说是一种协议,

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

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

FastCGI的工作原理

FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求,或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。

20181001142805270

流程:

  • web server 启动时载入FastCGI进程管理器
  • FastCGI进程管理器自身初始化,启动多个CGI解析器进程(可创建多个php-cgi),并等待来自web server的连接
  • 当客户端请求到达Web Server时,FasterCGI进程管理器选择并连接到一个CGI解析器。Web Server 将CGI环境变量和标准输入发送到FastCGI子进程php-cgi
  • FastCGI子程序处理后,将标准输出和错误信息从同一连接返回Web Server.当fastcgi子进程关闭连接是,请求便告处理完成。fastcgi子进程接着等待,并处理来自fastcgi进程管理器(运行在web server中)的下一个连接。在cgi模型中,php-cgi在此便退出了。

fastcig与cgi特点

  • 对应cgi来说,每个web请求php都必须重新解析php.ini,重新载入全部扩展,并重新初始化全部数据结构。而使用fastcig,所有这些都只在进程启动时发生一次。
  • 由于fastcgi是多进程,所以比cgi多线程消耗更多的服务器内存

php-fpm

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

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

直接杀死php-cgi进程,php就不能运行了。

上面2个问题,一直让很多人病垢了很久,所以很多人一直还是在用 Module 方式。

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

也就是说,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修改后的平滑重启。

其他

最初

客户端请求的都是静态网页(index.html),web server会去文件系统中找到这个文件,发送给浏览器。

20181001141559358

现在

请求的是 index.php,根据配置文件,Web Server知道这个不是静态文件,需要去找 PHP解析器来处理,那么他会把这个请求简单处理,然后交给PHP解析器。

20181001141750395

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

一些概念

CGI:是 Web Server 与 Web Application 之间数据交换的一种协议。
FastCGI:同 CGI,是一种通信协议,但比 CGI 在效率上做了一些优化。同 样, SCGI 协议与 FastCGI 类似。
PHP-CGI:是 PHP (Web Application)对 Web Server 提供的 CGI 协议的接口程序。
PHP-FPM:是 PHP(Web Application)对 Web Server 提供的 FastCGI 协议的接口程序,额外还提供了相对智能一些任务管理。
WEB 中,Web Server 一般指Apache、Nginx、IIS、Lighttpd、Tomcat等服务器。
Web Application 一般指PHP、Java、Asp.net等应用程序。

er 提供的 FastCGI 协议的接口程序,额外还提供了相对智能一些任务管理。
WEB 中,Web Server 一般指Apache、Nginx、IIS、Lighttpd、Tomcat等服务器。
Web Application 一般指PHP、Java、Asp.net等应用程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值