`
thinkry
  • 浏览: 39259 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

主程的晋升攻略(6):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。

 

  • 大小: 41.5 KB
0
0
分享到:
评论

相关推荐

    CGI与fastCGI

    1. 进程管理:CGI每次请求都会启动新的进程,而FastCGI则重用已存在的进程。 2. 性能:由于FastCGI避免了频繁创建和销毁进程,因此在高并发情况下,其性能优于CGI。 3. 资源利用率:FastCGI更节省系统资源,因为它...

    java源码:Java的FastCGI网关 jFastCGI.rar

    Java的FastCGI网关jFastCGI是一个用于在Java应用程序服务器和FastCGI服务器之间建立连接的开源库。FastCGI是一种常驻型(long-lived)的协议,旨在提高Web服务器性能,尤其是在处理动态内容时。它允许Web服务器将...

    什么是CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI.pdf

    FastCGI是CGI的扩展,像是一个常驻型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这就是CGI最为人诟病的fork-and-execute模式)。FastCGI支持分布式的运算,即FastCGI程序可以在网站...

    kcgi, 用于 C/C 的最小CGI和FastCGI库.zip

    kcgi, 用于 C/C 的最小CGI和FastCGI库 概要kcgi是用于 C/C 网络应用程序的开源CGI和FastCGI库。 它最小。安全和审计;并且适合于你的 BCHS软件栈。这里存储库包含版本之间的边缘代码: 要保持最新版本的kcgi,请访问...

    windows+IIS 环境下以Fastcgi方式配置php 5.3.3的方法

    步骤 6:配置 IIS 右键单击“网站”,选择“属性”,单击“主目录”选项,点击“配置”按钮,单击“添加”按钮,选择 FastCGI 扩展,并将扩展名设置为 .php。 步骤 7:测试 PHP FastCGI 创建 test.php 文件,并...

    fastcgi中文手册.pdf

    - **对比CGI**:CGI每次请求都会启动新的进程,处理完请求就结束,而FastCGI进程是长期存在的。 - **对比SSI**(Server Side Includes):SSI适用于简单的动态内容插入,而FastCGI适合处理复杂的动态页面生成。 -...

    FastCGI 下载FastCGI for IIS6下载 1.5(32位&64位)

    在本文中,我们将详细讨论FastCGI以及如何在IIS6上安装和使用FastCGI 1.5的32位和64位版本。 **FastCGI工作原理** FastCGI的工作方式是通过一个常驻进程来处理来自Web服务器的请求。当Web服务器接收到HTTP请求时,...

    FastCGI SDK

    FastCGI的核心设计目标是避免传统CGI模式下频繁启动和关闭进程带来的开销,通过保持进程的持久连接来提高效率。 **FastCGI工作原理** FastCGI在Web服务器和应用服务器之间建立持久的连接,当请求到来时,Web服务器...

    服务器大量php-cgi.exe进程,导致CPU占用100%的解决[定义].pdf

    - 程序采用FastCGI方式运行PHP,而`StartProcesses`设置过大(例如设置为6或更高),导致创建过多的`php-cgi.exe`进程。 - 系统临时文件过多,尤其是MySQL数据库的临时文件默认存储位置可能导致磁盘空间不足,进而...

    fastcgi.nim:Nim的FastCGI库

    6. **跨平台**:作为Nim库,`fastcgi.nim`可以编译成多种平台的目标代码,如Linux、macOS、Windows等。 **应用场景** - **动态内容生成**:用于处理动态网页请求,如PHP脚本通常通过FastCGI与Apache或Nginx交互。 ...

    nginx FastCGI错误Primary script unknown解决办法

    在centos上成功编译安装nginx 1.4、php 5.4并成功启动nginx和php-fpm后,访问php提示”File not found.”,同时在错误日志中看到: 代码如下:2013/10/22 20:05:49 [error] 12691#0: *6 FastCGI sent in stderr: ...

    php环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?

    FastCGI 是CGI的一个优化版本,它设计为常驻型,避免了每次请求时创建新进程的开销。FastCGI进程管理器会维护多个CGI解释器进程,例如PHP-CGI,这些进程在Web服务器启动时就已加载,能够快速响应请求。FastCGI支持...

    一文读懂CGI、FastCGI、php-cgi、php-fpm的区别

    一文读懂cgi、fastcgi、php-cgi、php-fpm的区别CGI诞生之前CGI的诞生CGI程序如何工作Web服务器的内置模块FastCGIphp-fpmphp-cgiphp-cgi与php-fpm的区别 CGI诞生之前 在CGI诞生之前Web服务器负责静态文件的存储、查找...

    kcgi:CC ++的最小CGI和FastCGI库

    **kcgi:C++的最小CGI和FastCGI库** `kcgi`是一个轻量级、高效的C++库,专为实现CGI(通用网关接口)和FastCGI协议而设计。它旨在提供一个简洁、易于理解和使用的API,以便开发者能够快速构建Web应用程序。在本文中...

    CGI 开发使用手册.

    3. **CGI程序处理**:CGI程序解析请求参数,执行相应的业务逻辑。 4. **生成响应**:CGI程序根据处理结果生成HTML或其他格式的数据。 5. **返回给Web服务器**:CGI程序将生成的响应内容返回给Web服务器。 6. **Web...

    Fastcgi中文手册

    FastCGI作为一种高性能的网络应用程序接口,解决了传统CGI存在的性能瓶颈问题,并提供了更好的伸缩性和高可用性支持。通过对FastCGI的工作原理、协议细节及其应用场景的深入理解,开发者可以更高效地利用这一工具,...

    FastCGI手册

    ### FastCGI手册知识点解析 #### 一、FastCGI技术概述 ...通过以上步骤,可以在Apache服务器上成功安装并配置FastCGI模块,从而实现对FastCGI技术的支持,进而提高Web应用程序的性能和响应速度。

    用VC开发CGI 用VC开发CGI

    - **文件句柄**:CGI程序可以使用`freopen()`重定向`stdin`、`stdout`和`stderr`到服务器指定的临时文件,以便于与Web服务器通信。 4. **编译与调试**:在VC中编译生成CGI程序,并将其部署到Web服务器的CGI目录下。...

Global site tag (gtag.js) - Google Analytics