什么是通用网关接口(CGI)?

时间:2010-01-18 21:15:49

标签: cgi

CGI是一种通用网关接口。顾名思义,它是所有东西的“通用”网关接口。从这个名字来看,它是如此微不足道和天真。我觉得我理解这一点,每次遇到这个词时我都会感受到这一点。但坦率地说,我没有。我还是很困惑。

我是一名具有Web开发经验的PHP程序员。

  

用户(客户)请求页面---> webserver( - >嵌入式PHP   翻译)---->服务器端(PHP)脚本---> MySQL服务器。

现在说我的PHP脚本可以从MySQL服务器获取结果& MATLAB服务器&其他一些服务器。

那么,现在PHP脚本是CGI吗?因为它的网络服务器之间的接口和所有其他服务器?我不知道。有时他们称CGI为技术与技术。其他时候他们称CGI为程序或其他服务器。

  • 究竟是什么?

  • /cgi-bin/*.cgi有什么关系?怎么了?我不知道服务器上的这个cgi-bin目录是什么。我不知道为什么他们有* .cgi扩展名。

  • 为什么Perl总是挡路。 CGI& Perl(语言)。我也不知道这两个是怎么回事。几乎所有的时间我一直听到这两个组合“CGI& Perl”。这本书是另一个很好的例子CGI Programming with Perl。为什么不“使用PHP / JSP / ASP进行CGI编程”?我从未见过这样的事情。

  • C中的CGI编程,让我很困惑。 “在C ”?认真?我不知道该说些什么。我只是困惑。 “在C ”?这改变了一切。程序需要编译和执行。这完全改变了我对网络编程的看法。我什么时候编译?如何执行程序(因为它将是一个机器代码,因此它必须作为一个独立的进程执行)。它如何与Web服务器通信? IPC?并使用套接字编程与所有服务器(在我的示例MATLAB和MySQL中)连接?我迷路了!!

  • 人们说CGI已被弃用,不再使用了。是这样吗?什么是最新更新?

  

有一次,我遇到了我的情况   不得不给HTTP PUT请求访问权限   Web服务器(Apache HTTPD)。它很长   背部。所以,据我记得这是   我做了什么:

     
      
  1. 编辑Apache HTTPD的配置文件,告诉webserver通过   对某些人的所有HTTP PUT请求   put.php(我必须写这个PHP   脚本)

  2.   
  3. 实施put.php来处理请求(将文件保存到该位置   提到的)

  4.         

    人们说我写了一个CGI脚本。   说真的,我不知道是什么   他们在谈论。

  • 我真的写过CGI脚本吗?

我希望你明白我的困惑是什么。 (因为我自己不知道我在哪里感到困惑)。我请求你们尽可能简单地保持你的答案。我真的无法理解任何花哨的技术术语。至少在这种情况下不是。

修改

我找到了这个惊人的教程"CGI Programming Is Simple!" - CGI Tutorial,它以最简单可能的方式解释了概念。阅读本文后,您可能需要阅读Getting Started with CGI Programming in C以补充您对实际代码示例的理解。我还将这些链接添加到维基百科的文章:http://en.wikipedia.org/wiki/Common_Gateway_Interface

12 个答案:

答案 0 :(得分:411)

CGI是一个接口,它告诉Web服务器如何将数据传入和传出应用程序。更具体地说,它描述了如何在环境变量(例如请求类型,远程IP地址)中传递请求信息,如何通过标准输入传递请求主体,以及如何通过标准输出传递响应。有关详细信息,请参阅CGI specification

使用您的图片:

user (client) request for page ---> webserver ---[CGI]----> Server side Program ---> MySQL Server.

大多数(如果不是全部),Web服务器可以配置为将程序作为“CGI”执行。这意味着Web服务器在收到请求后,会将数据转发到特定程序,设置一些环境变量并通过标准输入和标准输出编组参数,以便程序可以知道查找的位置和内容。

主要的好处是,您可以从Web运行任何可执行代码,因为Web服务器和程序都知道CGI如何工作。这就是为什么你可以使用常规的支持CGI的网络服务器用C或Bash编写Web程序的原因。那,并且大多数编程环境都可以轻松使用标准输入,标准输出和环境变量。

在您的情况下,您很可能使用另一个特定于PHP的脚本和网络服务器之间的通信方式,正如您在问题中提到的那样,这是一个名为mod_php的嵌入式解释器。

所以,回答你的问题:

  

CGI究竟是什么?

见上文。

  

与/cgi-bin/*.cgi有什么关系?怎么了?我不知道服务器上的这个cgi-bin目录是什么。我不知道为什么他们有* .cgi扩展名。

这是cgi程序的传统地方,许多网络服务器都预先配置了这个目录,可以将所有二进制文件作为CGI程序执行。 .cgi扩展名表示可以通过CGI工作的可执行文件。

  

为什么Perl总是挡路。 CGI& Perl(语言)。我也不知道这两个是什么。几乎所有的时间我一直听到这两个组合“CGI& Perl”。本书是另一个很好的例子,用Perl进行CGI编程为什么不用“用PHP / JSP / ASP进行CGI编程”。我从未见过这样的事情。

因为Perl是古老的(比CGI已经老了所有时代的PHP,JSP和ASP都已经存在,当CGI是新的时候Perl存在)并且因为通过CGI提供动态网页的非常好的语言而变得非常有名。如今,在网络服务器中运行Perl还有其他选择,主要是mod_perl

  C语言中的CGI编程让我很困惑。在C ??认真?我不知道该说些什么。 “我只是感到困惑。”在C“??这改变了一切。程序需要编译和执行。这完全改变了我对Web编程的看法。我什么时候编译?程序是如何执行的(因为它将是一个机器码,所以它必须作为一个独立的过程执行。)它如何与Web服务器进行通信?IPC?并使用套接字编程与所有服务器(在我的示例MATLAB和MySQL中)连接?我迷路了!! / p>

您编译可执行文件一次,Web服务器执行程序并将请求中的数据传递给程序并输出收到的响应。 CGI指定每个请求将启动一个程序实例。这就是为什么CGI现在效率低下而且过时了。

  

他们说CGI已被弃用。它不再使用。是这样吗?它的最新更新是什么?

当性能不是最重要的时候仍然使用CGI,并且需要一种简单的执行代码的方法。由于前面提到的原因,它是低效的,并且在网络环境中有更多现代的方法来执行任何程序。目前最着名的是FastCGI

答案 1 :(得分:63)

  

CGI究竟是什么?

Web服务器从程序(而不是文件)获取数据的方法。

  

与/cgi-bin/*.cgi有什么关系?

没什么大不了的。这只是一个惯例。

  

我不知道服务器上的这个cgi-bin目录是什么。   我不知道为什么他们有* .cgi扩展名。

服务器必须知道如何处理文件(即将其视为要执行的程序而不是简单地提供的程序)。扩展名为.html告诉它使用text / html内容类型。扩展名为.cgi,告诉它将其作为程序运行。

将可执行文件保存在单独的目录中可以防止执行不正确的文件和/或在服务器配置错误的情况下将CGI程序作为原始数据提供保护。

  

为什么Perl总是挡路。

没有。 Perl与CGI同时很受欢迎。

我多年没有使用过Perl CGI。我很长一段时间都在使用mod_perl,而且最近还在使用FastCGI进行PSGI / Plack。

  

这本书是另一个很好的例子,用Perl进行CGI编程   为什么不“使用PHP / JSP / ASP进行CGI编程”。

CGI效率不高。与PHP一起讨论程序的更好方法与PHP同时出现。 JSP和ASP 与程序交谈的不同方法。

  C语言中的CGI编程让我很困惑。在C ??严重??

这是一种编程语言,为什么不呢?

  

我什么时候编译?

  1. 编写代码
  2. 编译
  3. 访问网址
  4. Webserver运行程序
  5.   

    如何执行程序(因为它将是一个机器代码,所以它必须作为一个独立的进程执行)。

    它不必作为一个独立的进程执行(你可以在C中编写Apache模块),但CGI的整个概念是它启动了一个外部进程。

      

    它如何与Web服务器通信? IPC?

    STDIN / STDOUT和环境变量 - 如CGI规范中所定义。

      

    使用套接字与所有服务器(在我的示例MATLAB和MySQL中)连接   编程?

    使用您喜欢和支持的任何方法。

      

    他们说CGI是折旧的。它不再使用。是这样吗?

    CGI效率低,速度慢且简单。它很少使用,使用时,因为它很简单。如果性能不是很重要,那么简单性就值得一试。

      

    它的最新更新是什么?

    1.1

答案 2 :(得分:41)

CGI是Web服务器(HTTP服务器)和某种类型的可执行程序之间的接口规范,用于处理特定请求。

它描述了如何将该请求的某些属性传递给该程序的环境,以及程序应如何将响应传达回服务器以及服务器应如何“完成”响应以形成对原始文件的有效回复HTTP请求。

有一段时间CGI是IETF互联网草案,因此有一个到期日。它没有更新到期,因此没有CGI'标准'。它现在是一个信息性的RFC,但作为这样的文档通常的做法,并不是一个标准本身。 rfc3875.txtrfc3875.html

实现CGI接口的程序可以用目标机器上可运行的任何语言编写。他们必须能够访问环境变量并且通常标准输入,并且他们在标准输出上生成输出。

像C这样的编译语言通常被用作脚本语言,例如perl,通常使用库来更容易地访问CGI环境。

CGI的一大缺点是每个请求都会生成一个新程序,因此维护请求之间的状态可能是一个主要的性能问题。状态可能在cookie中处理或在URL中编码,但如果它变大,则必须存储在其他地方并从编码的url信息或cookie中键入。然后,每个CGI调用都必须从某个商店重新加载存储的状态。

出于这个原因,对于请求和会话的极其简单的接口,Web服务器和应用程序之间更好的集成环境更受欢迎。像apache的现代php实现这样的环境可以更好地与Web服务器集成目标语言,并提供对有效提供http请求所需的请求和会话对象的访问。它们提供了一种更简单,更丰富的方式来编写“程序”来处理HTTP请求。

您是否编写了CGI脚本而非依赖于解释。它确实完成了一个人的工作,但是将php作为一个模块运行更为常见,其中脚本和服务器之间的接口并不是严格意义上的CGI接口。

答案 3 :(得分:18)

CGI在RFC 3875中指定,尽管这是原NCSA document的后来“官方”编纂。基本上,CGI定义了一个协议,用于将有关HTTP请求的数据从Web服务器传递到要处理的程序 - 任何语言的任何程序。在编写规范时(1993年),大多数Web服务器只包含静态页面,“Web应用程序”是一种罕见的新事物,因此将它们与“正常”静态内容区分开来似乎很自然,例如除静态内容之外的cgi-bin目录,并以.cgi结尾。

目前,这里还没有像PHP这样的专用“网络编程语言”,而且C是主流的可移植编程语​​言 - 很多人用C语言写了他们的CGI脚本。但Perl很快就变得更适合这种事情,CGI几乎成了Perl的代名词。然后是Java Servlets,PHP和其他一些人,并接管了Perl的大部分市场份额。

答案 4 :(得分:13)

查看维基百科中的CGI。 CGI是Web服务器和外部程序之间的协议,它是处理输入并生成发送到浏览器的输出的脚本。

CGI是一种简单的Web服务器和程序通信方式,仅此而已。这里服务器管理网络连接和HTTP协议,程序处理输入并生成发送到浏览器的输出。 CGI脚本基本上可以是任何可以由Web服务器执行并遵循CGI协议的程序。因此,例如,可以在C中实现CGI程序。然而,这非常罕见,因为C不太适合该任务。

/cgi-bin/*.cgi是人们通常放置CGI脚本的简单路径。默认情况下,Web服务器通常配置为从该路径获取CGI脚本。

CGI脚本也可以用PHP实现,但所有PHP程序都不是CGI脚本。如果webserver嵌入了PHP解释器(例如Apache中的mod_php),则Web服务器和解释器之间的更高效的直接协议将跳过CGI阶段。

是否已实现CGI脚本取决于Web服务器执行脚本的方式。

答案 5 :(得分:12)

CGI基本上将请求传递给使用Web服务器配置的任何解释器 - 这可能是Perl,Python,PHP,Ruby,C几乎任何东西。 Perl是当天最常见的回归,这就是为什么你经常在参考CGI时看到它。

CGI没有死。事实上,大多数大型托管公司运行PHP作为CGI而不是mod_php,因为它提供用户级配置和其他一些东西,而它比mod_php慢。 Ruby和Python通常也作为CGI运行。它们的关键区别在于服务器模块作为实际服务器软件的一部分运行 - 与CGI一样,它完全在服务器外部服务器只使用CGI模块来确定如何将数据传递给外部解释器。

答案 6 :(得分:11)

CGI是一种机制,由Web服务器调用外部程序以处理请求,环境变量和标准输入用于将请求数据提供给程序。外部程序编写的确切语言无关紧要,尽管用某些语言编写CGI程序要比其他语言更容易。

由于CGI脚本需要执行权限,因此httpd默认只允许cgi-bin目录中的CGI程序运行(可能现在被误导)安全目的。

大多数PHP脚本都是通过mod_php在Web服务器进程中运行的。这不是CGI。

CGI很慢,因为必须根据请求启动程序(和相关的解释器)。现代替代品是由fast_CpI使用的嵌入式执行,由mod_php使用,以及长时间运行的进程。给定的语言可能有自己的方式来实现这些机制,所以在使用CGI之前一定要四处询问。

答案 7 :(得分:7)

您可能想知道什么不是CGI,答案是您的Web服务器的模块(如果我认为您运行Apache)。并且这是一个很大的差异,因为CGI需要和外部程序,线程,无论如何实例化PERL,PHP,C应用服务器,当你作为MODULE运行时,该程序是Web服务器(apache)本身。

由于这一切,有许多性能,安全性,可移植性问题发挥作用。但最好先了解CGI是什么,了解它是什么。

答案 8 :(得分:7)

一个真实的例子:一个需要在网站上显示的复杂数据库。由于数据库是在1986年左右设计的(!),因此以不同的方式打包了大量数据以节省磁盘空间。

随着开发的进行,开发人员再也无法在SQL中解决复杂的数据请求,例如因为排序算法不常见。

有三种明智的解决方案:

  1. 快速而脏:将未提供的数据发送给PHP,在那里进行排序。显然是一个非常昂贵的解决方案,因为每次调用页面时都会重复这个问题
  2. 将一个插件写入数据库引擎 - 但是管理员还没准备好允许外部代码在他们的服务器上运行,或者
  3. 您可以处理程序(C,Perl等)中的数据,并输出HTML。程序本身进入/ cgi-bin,由Web服务器(例如Apache)直接调用,而不是通过PHP调用。
  4. CGI在解决方案#3中运行您的脚本并将效果输出到浏览器。您具有编译程序的速度,语言的灵活性优于SQL,并且无需将插件编写到SQL服务器。 (同样,这是一个特定于SQL和C的示例)

答案 9 :(得分:7)

CGI脚本是一个控制台/ shell程序。在Windows中,当您使用“命令提示符”窗口时,您执行控制台程序。当Web服务器执行CGI脚本时,它使用环境变量或“标准输入”向控制台/ shell程序提供输入。标准输入就像在控制台/ shell程序中输入数据一样;在CGI脚本的情况下,Web服务器进行键入。 CGI脚本将数据写入“标准输出”,并将该输出作为HTML页面发送到客户端(Web浏览器)。标准输出类似于您在控制台/ shell程序中看到的输出,除了Web服务器读取并将其发送出去。

可以从浏览器执行CGI脚本。 URI通常包括提供给CGI脚本的查询字符串。如果方法是“get”,则查询字符串将在名为QUERY_STRING的环境变量中提供给CGI脚本。如果方法是“post”,则使用标准输入将查询字符串提供给CGI脚本(CGI脚本从标准输入读取查询字符串)。

早期使用CGI脚本是为了处理表单。在HTML的开头,HTML表单通常具有“action”属性和指定为“submit”按钮的按钮。当按下提交按钮时,“action”属性中指定的URI将被发送到服务器,其中来自表单的数据作为查询字符串发送。如果“action”指定了CGI脚本,那么将执行CGI脚本,然后生成一个HTML页面。

RFC 3875“通用网关接口(CGI)”部分定义了使用C的CGI,就像说环境变量“由C库例程getenv()或变量环境访问”。

如果您正在使用C / C ++开发CGI脚本并使用Microsoft Visual Studio执行此操作,那么您将开发一个控制台程序。

答案 10 :(得分:6)

CGI是您编写的程序(或Web API),并将其保存在Web Server站点上。 CGI是一个文件。

此文件位于Web服务器上并等待。当客户端浏览器向Web服务器发送执行CGI文件的请求时,Web服务器将在服务器站点上运行CGI文件。此CGI程序的输入(如果有)来自客户端浏览器。此CGI程序的输出将发送到浏览器。

您使用什么语言编写CGI程序?其他帖子已经提到过c,java,php,perl等。

答案 11 :(得分:4)

CGI背后的想法是程序/脚本(无论是Perl还是C)通过STDIN接收输入(请求数据)并通过STDOUT(echo,printf语句)输出数据。大多数PHP脚本不符合条件的原因是因为它们是在PHP Apache模块下运行的。