CGI=>FAST-CGI

CGI=>FAST-CGI_第1张图片

CGI(公共网关接口:Common Gateway Interface),外部应用程序与WEB服务器之间的接口标准,用来解释处理来自表单的输入信息;

CGI 是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能。CGI 应用程序能与浏览器进行交互,还可通过数据库API 与数据库服务器等外部数据源进行通信,从数据库服务器中获取数据。格式化为HTML文档后,发送给浏览器,也可以将从浏览器获得的数据放到数据库中。几乎所有服务器都支持CGI,可用任何语言编写CGI,包括流行的C、C ++、VB 和Delphi 等。CGI 分为标准CGI 和间接CGI两种。标准CGI 使用命令行参数或环境变量表示服务器的详细请求,服务器与浏览器通信采用标准输入输出方式;

在物理上是一段程序,运行在服务器上,提供同客户端HTML页面的接口:

先由用户在客户端输入信息,如评论之类的东西。接着用户发布或提交”(客户端),浏览器把信息传送到服务器的CGI目录下特定的CGI程序中,于是CGI程序在服务器上按照预定的方法进行处理 : 把用户提交的信息存入指定的文件中。然后CGI程序给客户端发送结果信息。

功能

绝大多数的CGI程序被用来解释处理来自表单的输入信息,并在服务器产生相应的处理,或将相应的信息反馈给浏览器。CGI程序使网页具有交互功能。

处理步骤

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

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

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

⑷web服务器把结果送回到用户, CGI能够让浏览者与服务器进行交互

工作原理

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

2.服务器收发到请求。

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

4.CGI应用程序执行所需要的操作,通常是基于浏览者输入的内容。

5.CGI应用程序把结果格式化为网络服务器和浏览器能够理解的文档(通常是HTML网页)。

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

优点

CGI可以为我们提供许多HTML无法做到的功能, 要把客户端的信息记录在服务器的硬盘上,就要用到CGI。这是CGI最重要的作用,它补充了Html的不足。是的,仅仅是补充,不是替代。

它是运行在Web服务器上的一个程序,并由来自于浏览者的输入触发。CGI是在HTTP服务器下运行外部程序(或网关)的一个接口,它能让网络用户访问远程系统上的使用类型程序,就好像他们在实际使用那些远程计算机一样。

CGI应用程序运行在浏览器可以请求的服务器系统上,执行时需要使用服务器CPU时间和内存,但是当大批同时使用一个CGI应用程序是会反应较慢,网络服务器 速度也会受到很大影响。

CGI应用程序的优点是可以独立运行。

缺点是性能差,因为每次服务器遇到这些脚本都需要重新启动脚本解析器来执行脚本;

FastCGI : 常驻(long-live)型的CGI,只要激活后可以一直执行着,还支持分布式的运算, 即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。

CGI=>FAST-CGI_第2张图片

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

原理

1、Web Server启动时载入FastCGI进程管理器;

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通常有多慢。每一个Web请求PHP都必须重新解析php.ini、重新载入全部扩展并重初始化全部数据结构。使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的好处是,持续数据库连接(Persistent database connection)可以工作。

特点

1、如CGI, FastCGI在进程中的应用程序,独立于核心web服务器运行,提供了一个比API更安全的环境;

2、如CGI,FastCGI的不依赖于任何Web服务器的内部架构,因此即使服务器技术的变化, FastCGI依然稳定不变。

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

Nginx + PHP (FastCGI)服务器在3万并发连接下,开启的10个Nginx进程消耗150M内存(15M*10=150M),开启的64个php-cgi进程消耗1280M内存(20M*64=1280M),加上系统自身消耗的内存,总共消耗不到2GB内存。如果服务器内存较小,完全可以只开启25个php-cgi进程,这样php-cgi消耗的总内存数才500M。

FastCGI就是对CGI的改进(Server和脚本解析器完全分开各负其责)

脚本处理器会启动一个或者多个daemon进程,每次HTTPServer遇到脚本的时候,直接交付给FastCGI的进程来执行,然后将得到的结果(通常为html)返回给浏览器。

问题是当遇到大流量的频繁请求的话,脚本处理器的daemon进程可能会超负荷从而变得很慢,甚至发生内存泄漏;

PHP以CGI方式运行时,当一个请求向web server请求动态页时,web server总会fork一个CGI解释器进程进行处理这个请求,进程处理完成之后将结果返回给web server,web server将结果返回并显示出来,进程结束,当用户再次请求同一个页面时,web server总会fork一个进程进行处理,这样效率会比较低下;

FASTCGI是常驻内存的CGI,实际上是对CGI程序的进程管理,通过master进程接受请求,分发给worker进程,并可以prefork worker进程,减少CGI进程创建、初始化和销毁的开销,从而提高性能。

PHP以fast-CGI方式运行时,fast-CGI是在web server的启动时,载入fast-CGI进程管理器,fast-CGI fork多个CGI解释进程,当fast-CGI接收到一个用户请求时,会选择并连接一个CGI解释进程,CGI解释进程接收连接并处理,然后将结果返回给web server,此CGI解释进程工作结束,但web server并不会销毁该进程,而是常驻内存中,此进程则继续等待fast-CGI进程管理器发来的下一个请求,处理请求的效率大大提高。

你可能感兴趣的:(PHP)