主程序员的练成:CGI和FastCGI

消息经过网络传输,到达了服务器端,最常见的服务器是Web服务器,做PHP的同学都知道FastCGI模式的PHP比普通PHP更高效,这篇就聊聊其中的原理。

古老但常见的CGI

Web服务器能解析HTTP请求,返回静态资源(HTML页、图片等),但要输出动态内容,必须得PHP/C#/Ruby/Java/Python/C/C++这些外部程序来实现。

早期有个技术叫CGI(Common Gateway Interface,通用网关接口),是用于Web服务器和外部程序之间传输数据的一种标准。一个简单的CGI程序(C++语言)如下:

#include <stdio.h>
#include <stdlib.h>
int main()
{
       printf("Content-type: text/html\r\n\r\n");
       printf("your name is:%s\n",  getenv("QUERY_STRING"));
       return 0;
}

浏览器访问这个CGI程序,就会显示:your name is:name=xxx

CGI规定了Web服务器如何和CGI程序之间传输数据,具体过程大体是这样:

1、Web服务器收到的请求信息后,启动CGI程序(apache是fork进程exec CGI程序);

2、Web服务器通过环境变量和标准输入把请求信息传递给CGI程序;

3、CGI程序执行业务逻辑后,通过标准输出和标准错误把响应数据返回给Web服务器,CGI程序exit;

4、Web服务器再组织成HTTP响应包发给浏览器。

在上面的例子中,第一行printf是输出HTTP头(还记得HTTP Header和Body是用\r\n\r\n分割的么?),getenv("QUERY_STRING")是从环境变量获取URL,printf是通过标准输出返回内容。

Web服务器会把哪些信息通过环境变量传递给CGI程序?常用的有这些:

  • CONTENT_LENGTH :向标准输入发送的数据的字节数(POST)
  • QUERY_STRING:实际存放发送给CGI程序的数据(GET)
  • REQUEST_METHOD:传送数据所用的CGI方法(GET或POST)
  • HTTP_COOKIE:cookie值
  • REMOTE_ADDR:用户IP
  • SCRIPT_NAME:请求的CGI

可以看到CGI只是一种标准,可以用任何一种语言编写CGI程序,只要这种语言具有标准输入、标准输出和环境变量,比如:C/C++,perl,PHP、ruby。按照CGI标准要求,就能和Web服务器交互起来。

FastCGI应运而生

CGI是通过环境变量/标准输入、标准输出/标准错误来传输数据,运行性能比较低,主要有两点:

1、每个请求都需要Web服务器去fork出CGI程序,频繁fork进程比较耗时

2、CGI程序每次都是从头运行,读配置、连接其他服务都得重新来,也比较耗时

FastCGI是对CGI的改进,FastCGI模式下,Web服务器和FastCGI程序传输数据的过程大体是:

1、Web服务器收到的请求信息后,按FastCGI协议把请求信息通过socket发给FastCGI程序;

2、FastCGI程序执行业务逻辑后,通过socket把响应数据返回给Web服务器,FastCGI程序不exit;

3、Web服务器再组织成HTTP响应包发给浏览器。

对比CGI的通过,可以发现主要是少了每次fork的过程,并且用socket来传输数据,这是FastCGI接口更高效的原因。

FastCGI有这些特点:

  • FastCGI程序常驻内存,启动后可以反复处理请求
  • FastCGI 就是进程池/线程池模型的通用同步服务器框架

FastCGI程序处理请求后不会退出,可以反复处理请求,那么在启动后就把配置解析、与其他后台的连接建立好,不用每次请求时搞一边,自然更快了。

至于这个FastCGI内部如何实现进城池/线程池,就是FastCGI进程管理器(FastCGI引擎)的事情了。C/C++ FastCGI常用apache的mod_fastcgi模块,PHP常用spawn-fcgi和PHP-FPM。

-------- 分割线 ---------

1.主程序员的练成:引言

2.主程序员的练成:技术篇概要

3.主程序员的练成:IP、DNS和CDN

4.主程序员的练成:TCP、消息分包和协议设计

5.主程序员的练成:HTTP协议和二进制协议的对比

推荐下wecode程序员云笔记──为程序员而生的开源、简洁高效的云笔记软件,使用有道云做云端存储。

★ 【语法高亮】目前支持 C/C++、C#、Pascal、Java、VB.Net、XML、HTML、Python、SQL等多种方。

★ 【云端存储】除了本地笔记本外,还增加了云存储功能,目前使用有道云笔记做为云存储。

★ 【文档加密】提供了文档加密功能,确保敏感文档的安全性。

★ 【多个本地笔记本】支持多个本地笔记本,你能够新建本地笔记本、打开、压缩和备份本地笔记本。

★ 【文章附件】能够为每个文章添加多个附件,并能够在临时目录中打开附件、导出附件。有道云的附件也存储在云端。

时间: 2024-10-11 08:59:22

主程序员的练成:CGI和FastCGI的相关文章

主程序员的练成:HTTP协议和二进制协议的对比

在上一篇<主程序员的练成:TCP.消息分包和协议设计>中谈了协议设计的一些话题,这里补充聊聊HTTP协议和二进制协议的对比. HTTP协议是一种文本协议,也是一种Name-Based协议,就从这两方面来说. 文本协议 vs 二进制协议 文本协议的特点: 便于人 易于阅读.理解.调试.构造 解析复杂.冗余多 需要考虑字符转义 二进制协议的特点: 便于机器 Name-Based vs Position-Based Name-Based协议的特点: 协议字段都用Name标识 协议字段与位置无关 协议

主程序员的练成:TCP、消息分包和协议设计

在<主程序员的练成:IP.DNS和CDN>中,一次网络请求经过DNS解析知道了目的IP,现在就要发出网络包,这里我们说一说TCP的相关话题. TCP是一种流式协议 讲网络编程的教科书一般都会对TCP的可靠传输,api用法做详细说明,但对于TCP是一种流式协议讲解的不多,但这背后隐藏着很重要的一个知识点.先做个名词定义方便交流,这里的"消息"是指应用层的一个完整的协议包. 流式协议的特点是什么?就像流水连续不断那样,消息之间没有边界.例如send了3条消息,分别是100字节.

主程序员的练成──引言

虽然是引言,但也很重要. 程序员如何成长?这个话题百度有大约170万个相关结果,介绍了不少从菜鸟到老鸟的经验,但如何成长为主程序员(以下简称主程),网上的"帮助文档"不完善,也缺少实践指南.本系列文章主题就是说说主程如何练成.为什么用"练"这个字,因为主程的很多技能光知道怎么做远远不够,还需要在实践中不断"训练"才能运用好.只有不断训练才能从知到行,从"知道"成长为"做到". 团队在任命主程时,大多会挑选经

主程序员的练成:技术篇概要

技术是程序员安身立命的家伙,主程的技术不强,向下难以服众,向上有负重托. 或许有人会问:技术深度上该挖多深才能做好主程?程序员至少有两个高阶成长方向: 1.技术型专家非常热爱技术本身,往往会钻研得非常深,甚至可以不承担管理职责(你心目中的榜样是谁?): 2.项目型专家着力于更好更快的实现项目,主导项目的团队组建.技术选型.架构设计.项目进度和质量管理等等,技术深度上不像技术型专家那么深,一般承担管理职责. 主程属于项目型专家方向,对技术深度广度的要求是够用就好,我对程序开发持实用主义态度,80%

网关协议学习:CGI、FastCGI、WSGI

CGI CGI即通用网关接口(Common Gateway Interface),是外部应用程序(CGI程序)与Web服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的规程.CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将Web的一组简单的静态超媒体文档变成一个完整的新的交互式媒体.通俗的讲CGI就像是一座桥,把网页和WEB服务器中的执行程序连接起来,它把HTML接收的指令传递给服务器的执行程序,再把服务器执行程序的结果返还给HTML页.CGI 的

【技术分享】网关协议学习:CGI、FastCGI、WSGI

CGI CGI即通用网关接口(Common Gateway Interface),是外部应用程序(CGI程序)与Web服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的规程.CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将Web的一组简单的静态超媒体文档变成一个完整的新的交互式媒体.通俗的讲CGI就像是一座桥,把网页和WEB服务器中的执行程序连接起来,它把HTML接收的指令传递给服务器的执行程序,再把服务器执行程序的结果返还给HTML页.CGI 的

PHP-汇总CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI

什么是CGI CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种程序,运行在服务器(实体服务器啊!)上.是一种重要的互联网技术,可以让一个客户端从网页浏览器向在执行在Web服务器上的程序请求数据.CGI描述了客户端和这个程序之间传输数据的一种标准.这些可执行程序通常就叫做CGI脚本,他们 就是普通的程序,也是独立的应用程序,通常由所谓的脚本语言写成,如Perl等.CGI的工作方式,从Web服务器的角度看,是在

比较CGI,FastCGI,PHP-CGI与PHP-FPM的区别

最早的Web服务器,可以简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏览器,也就是静态html. 随着时间的变化,网站也越来越复杂,所以出现动态技术.但是服务器并不能直接运行 php,asp这样的文件,自己不能做,外包给别人吧,但是要与第三做个约定,我给你什么,然后你给我什么,就是握把请求参数发送给你,然后我接收你的处 理结果给客户端.那这个约定就是 common gateway interface,简称cgi.(cgi只是接口协议) image.png cgi就像

PHP工作原理及五大运行模式:包括cgi 、fast-cgi、cli、isapi、Web模块模式

PHP的五大运行模式 1)CGI( Common Gateway Interface):即通用网关接口, 2)FastCGI( Long-Live CGI):即常驻型通用网关接口 3)CLI( Command Line Interface):即命令行运行接口 4)Web模块模式(Apache等Web服务器运行的模式) 5)ISAPI(Internet Server Application Program Interface)   1.1 CGI是一种让客户端(web浏览器)与Web服务器(ngi