CGI(通用网关接口,Common Gateway Interface)

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服务器再把结果返回给浏览器。

FastCGI(快速通用网关接口,Fast Common Gateway Interface)

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,所有这些都只在进程启动时发生一次。

PHP-CGI(PHP通用网关接口,FastCGI Process Manager)

PHP-CGI是PHP的解释器,是PHP自带的FastCGI管理器。不支持平滑重启

PHP-FPM(PHP Fastcgi进程管理器,FastCGI Process Manager)

PHP-FPM调用PHP解释器(PHP-CGI)进程来处理请求,实现了Fastcgi协议,已被PHP官方收录
PHP-FPM控制的进程cpu回收的速度比较慢,内存分配均匀,有效控制内存和进程
PHP-FPM的配置在php-fpm.ini文件里,可以通过php/sbin/php-fpm进行启动、关闭,支持平滑重启,在./configure的时候带–enable-fpm参数即可开启PHP-FPM

参考资料:
http://www.nowamagic.net/librarys/veda/detail/1319
https://segmentfault.com/q/1010000000256516

CGI概念的更多相关文章

  1. 【Web学习笔记】浅析CGI概念及用法

    1. CGI是什么         CGI是Common Gateway Interface的简写,它提供了一种标准方法使得位于WebServer后端的web应用可以根据client的请求动态生成网页 ...

  2. CGI和ISAPI

    1) CGI概念CGI即通用网关接口(Common Gateway Interface),它是一段程序,运行在服务器上,提供同客户端HTML页面的交互,通俗的讲CGI就象是一座桥,把网页和WEB服务器 ...

  3. CGI/FASTCGI/ISAPI区别

    一 CGI原理及其性能 1) CGI概念CGI即通用网关接口(Common Gateway Interface),它是一段程序,运行在服务器上,提供同客户端HTML页面的交互,通俗的讲CGI就象是一座 ...

  4. 简单说明CGI是什么

    html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...

  5. 简单说明CGI和动态请求是什么

    1. CGI是什么 CGI是common gateway interface的缩写,大家都译作通用网关接口,但很不幸,我们无法见名知意. 我们知道,web服务器所处理的内容都是静态的,要想处理动态内容 ...

  6. CGI与ISAPI的区别(转)

    一 CGI原理及其性能 1) CGI概念CGI即通用网关接口(Common Gateway Interface),它是一段程序,运行在服务器上,提供同客户端HTML页面的交互,通俗的讲CGI就象是一座 ...

  7. [转帖]CGI与ISAPI的区别(转)

    CGI与ISAPI的区别(转) 不知道原始网站是哪个 博客园里面也是转帖的 https://www.cnblogs.com/eret9616/p/8515095.html 不过我还是不了解CGI和IS ...

  8. 基础概念PHP-FPM、FastCGI和CGI

    在搭建 LAMP/LNMP 服务器时,会经常遇到 PHP-FPM.FastCGI和CGI 这几个概念.如果对它们一知半解,很难搭建出高性能的服务器.接下来我们就以图形方式,解释这些概念之间的关系. 基 ...

  9. CGI、FastCGI和php-fpm的概念和区别

    CGI是HTTP Server和一个独立的进程之间的协议,把HTTP Request的Header设置成进程的环境变量,HTTP Request的正文设置成进程的标准输入,而进程的标准输出就是HTTP ...

随机推荐

  1. github push时,要求密码的问题

    整几次才搞的有点明白: 1 clone 项目 用 SSH: 在github 上如下图 2 C:\Users\<用户名> 下如果有 "_netrc" 文件: 如果含有 如 ...

  2. 【原】iOS学习之Masonry第三方约束

    1.Masonry概述 目前最流行的Autolayout第三方框架 用优雅的代码方式编写Autolayout 省去了苹果官方恶心的Autolayout代码 大大提高了开发效率 框架地址:https:/ ...

  3. 【BZOJ】4001: [TJOI2015]概率论

    题意 求节点数为\(n\)的有根树期望的叶子结点数.(\(n \le 10^9\)) 分析 神题就打表找规律.. 题解 方案数就是卡特兰数,$h_0=1, h_n = \sum_{i=0}^{n-1} ...

  4. C++ Primer Plus 第六版笔记

    C++ Primer Plus 第六版笔记 关于对象声明的思考 转自:http://www.cnblogs.com/weiqubo/archive/2009/11/02/1930042.html C+ ...

  5. 如何去掉dede列表推荐时标题被加粗

    dede在列表推荐文章默认为加粗不清楚的可以看图: 那个加黑的是默认的.如果你不想要被加黑,可以做如下改动.在include里找到文件:arc.listview.class.php查找并删除(注释掉也 ...

  6. webScoket的浅短的认识

    在一般的发送数据请求的时候都是用的http协议,但是对于类似即时聊天,需要客户端与服务器不间断的交互的时候对于http协议来说就不太适用了.因为http协议无法主动把数据发到客户端,而且客户端发送请求 ...

  7. 在linux下Ant的环境配置

    Ant(英文全称为another neat tool,另一个简洁的工具)是一个基于Java的生成工具,Ant将会被应用到Java项目中. 同样的,现在要来安装Ant(最近要安装的东西还蛮多的=m=), ...

  8. [LeetCode] All solution

    比较全的leetcode答案集合: kamyu104/LeetCode grandyang

  9. AJAX回调函数,返回JSON格式,应该返回自定义状态STATUS,但是却返回200

    返回200应该是方法已经执行通的意思,但是没返回自定义的status,仔细一看json格式拼错了...

  10. php-(/usr/local/php)安装编译选项

    ./configure \ --prefix=/usr/local/php \ --with-config-file-path=/usr/local/php/etc \ --enable-fpm \ ...