CGI是Web服务器与请求处理程序之间传输数据的一种标准,保证Web服务器传递过来的数据是标准格式的,其程序须运行在网络服务器上。
CGI能够用任何一种语言编写,只要这种语言具备标准输入、输出和环境变量。
工做原理:
每当客户请求CGI的时候,WEB服务器就请求操做系统生成一个新的CGI解释器进程(如:PHP-CGI),当CGI知足要求后,WEB服务器就杀死这个进程。
Web服务器(如:Nginx)只是内容的分发者,若是请求/index.html,Web服务器会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据。
若是如今请求的是/index.php,根据配置文件,Nginx知道这个不是静态文件,他会把这个请求简单处理后交给PHP解释器。
Nginx会传哪些数据给PHP解释器呢?url,查询字符串,POST数据,HTTP header等,CGI就是规定要传哪些数据、以什么样的格式传递给后方处理这个请求的协议。
当Web服务器收到/index.php这个请求后,会启动对应的CGI程序,这里就是PHP的解释器。
接下来PHP解释器会解析php.ini文件,初始化执行环境,而后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程。Web服务器再把结果返回给浏览器。php
FastCGI是Web服务器与请求处理程序之间传输数据的一种标准,是CGI的加强版本,用来减小网页服务器与CGI程序之间互动的开销,从而使服务器能够同时处理更多的网页请求。
FastCGI像是一个常驻(long-live)型的CGI,只要激活后,它能够一直执行着。
FastCGI支持分布式的运算,程序能够在网站服务器之外的主机上执行而且接受来自其它网站服务器来的请求。
FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并提供良好的性能、伸缩性、 Fail-Over特性等等。
FastCGI在进程中的应用程序,不依赖于任何Web服务器的内部架构,独立于核心Web服务器运行,即便服务器技术的变化,FastCGI依然稳定不变。
工做原理:
Web服务器启动时载入FastCGI进程管理器(如:Apache Module)
FastCGI进程管理器自身初始化,启动多个CGI解释器进程(多个php-cgi)并等待来自Web服务器的链接
当客户端请求到达Web服务器时,FastCGI进程管理器选择并链接到一个CGI解释器。Web服务器将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
FastCGI子进程完成处理后将标准输出和错误信息从同一链接返回Web服务器。当FastCGI子进程关闭链接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web服务器中)的下一个链接。在CGI模式中,php-cgi在此便退出了。
在上述状况中,你能够想象CGI一般有多慢。每个Web请求PHP都必须从新解析php.ini、从新载入所有扩展并重初始化所有数据结构。
使用FastCGI,全部这些都只在进程启动时发生一次。html
PHP-CGI是PHP的解释器,是PHP自带的FastCGI管理器。不支持平滑重启浏览器
PHP-FPM调用PHP解释器(PHP-CGI)进程来处理请求,实现了Fastcgi协议,已被PHP官方收录
PHP-FPM控制的进程cpu回收的速度比较慢,内存分配均匀,有效控制内存和进程
PHP-FPM的配置在php-fpm.ini文件里,能够经过php/sbin/php-fpm进行启动、关闭,支持平滑重启,在./configure的时候带–enable-fpm参数便可开启PHP-FPM服务器