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

CGI是一个通用网关接口,顾名思义,它是万事万物的“通用”网关接口。从名字看是如此的琐碎和幼稚。我感觉自己理解了这个,每次遇到这个词都有这种感觉,但坦白说,我没有,我仍然很困惑。

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

用户(客户端)请求页面--->网络服务器(->嵌入式PHP 解释器) ----> 服务器端(PHP)脚本--->MySQL Server.

现在假设我的PHP脚本可以从MySQL服务器和MATLAB服务器以及其他服务器获取结果。

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

  • 什么是CGI?

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

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

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

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

有一次,我遇到了一个情况 必须将HTTP PUT请求访问权限授予 Web服务器(Apache HTTPD)。这是一个很长的 回来了。所以,据我所知,这是 我做了什么:

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

  2. 实现put.php来处理请求(将文件保存到 提到)

有人说我写了一个CGI脚本。 说真的我一点头绪都没有 他们在谈论什么?

  • 我真的写了CGI脚本吗?

我希望你们能理解我的困惑是什么。(因为我自己也不知道我在哪里困惑)。我请求你们的回答尽可能简单。我真的不懂任何花哨的技术术语。至少在这种情况下不是。

编辑:

我发现了这个惊人的教程“CGI编程很简单!”-CGI教程,它以可能的方式解释了最简单中的概念。阅读本文后,您可能想阅读开始使用C进行CGI编程,以用实际的代码示例来补充您的理解。我还将这些链接添加到维基百科的文章中:http://en.wikipedia.org/wiki/Common_Gateway_Interface

208582 次浏览

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

使用您的图像:

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

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

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

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

回答你的问题:

什么是CGI?

见上文。

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

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

为什么Perl总是挡着路。CGI和Perl(语言)。我也不知道这两个是怎么回事。几乎所有的时间我都在听到这两个组合“CGI和Perl”。这本书是另一个很好的例子CGI Programming with Perl为什么不“CGI Programming with PHP/JSP/ASP”。我从来没有见过这样的东西。

因为Perl很古老(比PHP、JSP和ASP都要古老,当CGI已经很老了,Perl在CGI还很新的时候就存在了),并且因为是一种通过CGI提供动态网页的非常好的语言而变得相当有名。现在还有其他在Web服务器上运行Perl的替代方案,主要是mod_perl

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

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

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

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

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

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

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

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

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

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

您是否实现了CGI脚本取决于Web服务器如何执行您的脚本。

什么是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不是很有效。从Web服务器与程序对话的更好方法与PHP几乎同时出现。JSP和ASP与程序对话的不同方法。

用C进行CGI编程这让我很困惑。在C中??认真的??

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

我什么时候编译?

  1. 编写代码
  2. 编译
  3. 访问URL
  4. webserver运行程序

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

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

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

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

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

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

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

CGI是低效、缓慢和简单的。它很少被使用,当它被使用时,那是因为它很简单。如果性能不是什么大问题,那么简单是很有价值的。

它的最新更新是什么?

1.1

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

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

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

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

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

当时,这里也没有像PHP这样专门的“Web编程语言”,而C是主导的可移植编程语言——所以很多人用C编写他们的CGI脚本。但Perl很快被证明更适合这种东西,CGI在一段时间内几乎成为Perl的代名词。然后出现了JavaServlet、PHP和其他一些语言,占据了Perl的大部分市场份额。

CGI背后的想法是程序/脚本(无论是Perl还是C)通过STDIN(请求数据)接收输入,并通过STDOUT(回显,printf语句)输出数据。

大多数php脚本不符合条件的原因是它们在php Apache模块下运行。

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请求的方式。

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

你可能想知道什么不是CGI,答案是你的Web服务器的模块(如果我假设你运行的是Apache)。这是很大的区别,因为CGI需要和外部程序、线程等来实例化PERL、PHP、C应用程序服务器,当你作为模块运行时,该程序本身就是Web服务器(apache)。

正因为如此,有很多性能、安全性和可移植性问题在起作用。但最好先知道什么不是CGI,了解它是什么。

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

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

有三种合理的解决方案:

  1. 快速而肮脏:将未经审查的数据发送到PHP,在那里进行排序。显然这是一个非常昂贵的解决方案,因为每次调用页面时都会重复此操作
  2. 为数据库引擎编写插件——但管理员还没有准备好允许外部代码在他们的服务器上运行,或者
  3. 您可以在程序(C、Perl等)中处理数据,并输出超文本标记语言。程序本身进入 /cgi-bin,由Web服务器(例如Apache)直接调用,而不是通过PHP。

CGI在解决方案#3中运行您的脚本并将效果输出到浏览器。您拥有编译程序的速度,语言的灵活性比SQL更广泛,并且无需向SQL服务器编写插件。(同样,这是SQL和C的特定示例)

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

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

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

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

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

CGI脚本的早期用途是处理表单。在超文本标记语言的开始,超文本标记语言表单通常有一个“动作”属性和一个指定为“提交”按钮的按钮。当按下提交按钮时,“动作”属性中指定的URI将与表单中的数据一起作为查询字符串发送到服务器。如果“动作”指定了CGI脚本,那么CGI脚本将被执行,然后生成一个超文本标记语言页面。

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

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