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

CGI是一个通用网关接口。 正如名字所说,它是一切“通用”的网关接口。 这个名字太琐碎而天真了。 我觉得我明白了这一点,每次遇到这个词我都会感觉到这一点。 但坦率地说,我没有。 我仍然困惑。

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

用户(客户端)请求页面—> webserver( – >embedded式PHP解释器)—->服务器端(PHP)脚本—> MySQL服务器。

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

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

  • CGI到底是什么?

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

  • 为什么Perl总是来的方式。 CGI和Perl(语言)。 我也不知道这两个是怎么回事。 几乎所有的时间,我都听到这两个组合“CGI和Perl”。 本书是用Perl编写的另一个很好的CGI编程实例。 为什么不用“PHP / JSP / ASP的CGI编程”? 我从来没有见过这样的事情

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

  • 人们说CGI已经被弃用了,而且还没有被使用。 是这样吗? 什么是最新的更新?

有一次,我遇到了一个情况,我不得不向HTTP服务器(Apache HTTPD)提供HTTP PUT请求访问。 它的后面。 所以,据我所知,这是我所做的:

  1. 编辑Apache HTTPD的configuration文件告诉web服务器把所有的HTTP PUT请求传递给一些put.php (我必须写这个PHP脚本)

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

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

  • 我真的写了CGI脚本吗?

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

编辑:

我发现这个神奇的教程“CGI编程很简单!” – CGI教程 ,它以最简单的方式解释了这些概念。 阅读本文后,您可能需要阅读C语言入门CGI编程,以补充您对实际代码示例的理解。 我还将这些指南的链接添加到维基百科的文章中: http : //en.wikipedia.org/wiki/Common_Gateway_Interface

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

要使用您的图片:

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

大多数(如果不是全部的话),web服务器可以被configuration成作为“CGI”执行程序。 这意味着networking服务器在接收到请求后,会将数据转发到特定的程序,通过标准input和标准输出设置一些环境variables和编组参数,以便程序可以知道在哪里寻找什么。

主要的好处是,你可以运行任何可执行代码,因为networking服务器和程序都知道CGI是如何工作的。 这就是为什么你可以用C或Bash编写networking程序,并使用普通的支持CGI的networking服务器。 而且,大多数编程环境可以轻松使用标准input,标准输出和环境variables。

在你的情况下,你最有可能使用另一个特定于PHP的脚本和networking服务器之间的通信方式,就像你在问题中提到的那样,这是一个名为mod_php的embedded式解释器。

所以,回答你的问题:

CGI到底是什么?

往上看。

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

这是cgi程序的传统地方,许多web服务器都带有这个目录,这个目录被预先configuration为在CGI程序中执行所有的二进制文件。 .cgi扩展名表示可以通过CGI工作的可执行文件。

为什么Perl总是来的方式。 CGI和Perl(语言)。 我也不知道这两个是怎么回事。 几乎所有的时间我都听到这两个组合“CGI&Perl”。 这本书是另一个很好的例子,用Perl编写CGI程序为什么不用“PHP / JSP / ASP的CGI编程”。 我从来没有见过这样的事情

由于Perl是古老的(早于PHP,JSP和ASP,当CGI已经老了,Perl在CGI新的时候就已经存在了),并且因为通过CGI为dynamic网页提供服务而变得非常有名。 现在,在web服务器上运行Perl还有其他的select,主要是mod_perl 。

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

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

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

当性能不重要时,仍然使用CGI,并且需要执行代码的简单方法。 前面提到的原因是效率低下的,而且在networking环境中执行任何程序的方式都比较现代化。 目前最着名的是FastCGI 。

CGI到底是什么?

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

与/cgi-bin/*.cgi有什么大不了的?

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

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

服务器必须知道如何处理该文件(即将其视为执行的程序而不是简单的服务)。 有一个.html扩展名告诉它使用文本/ html内容types。 有一个.cgi扩展名告诉它运行它作为一个程序。

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

为什么Perl总是来的方式。

它不。 在CGI的同时,Perl只是很大而且很受欢迎。

多年来我没有使用Perl CGI。 我很长一段时间使用mod_perl,并且最近趋向于使用FastCGI的PSGI / Plack。

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

CGI不是很有效率。 与PHP相同的时间,与web服务器程序交stream的更好的方法就出现了。 JSP和ASP 与程序交谈的不同方法。

C中的CGI编程使我感到困惑。 在C? 认真?

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

我什么时候编译?

  1. 编写代码
  2. 访问url
  3. Webserver运行程序

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

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

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

STDIN / STDOUT和环境variables – 在CGI规范中定义。

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

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

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

CGI效率低下,缓慢而简单。 使用时很less使用,因为它很简单。 如果性能不是什么大问题,那简单就是值得的。

它的最新更新是什么?

1.1

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

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

一段时间CGI是一个IETF互联网草案,因此有一个到期date。 它过期没有更新,所以没有CGI“标准”。 它现在是一个信息的RFC,但是这样的文件通常的做法,并不是一个标准本身。 rfc3875.txt , rfc3875.html

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

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

CGI的一大缺点是每个请求都会产生一个新程序,所以在请求之间保持状态可能是一个主要的性能问题。 这个状态可能在cookies中被处理,或者被编码到一个URL中,但是如果这个状态变得很大,它必须被存储在其他地方,并且被编码的url信息或者cookie所控制。 每个CGI调用都必须从某个商店的某个地方重新加载存储的状态。

出于这个原因,并且为了使请求和会话的接口非常简单,Web服务器和应用程序之间更好的集成环境更受欢迎。 使用apache的现代php实现的环境更好地将目标语言与web服务器集成在一起,并提供访问有效提供http请求所需的请求和会话对象。 他们提供了一个更容易和更丰富的方式来编写“程序”来处理HTTP请求。

无论你写一个CGI脚本,而是取决于解释。 它确实做了一个工作,但是运行php作为一个模块,其中脚本和服务器之间的接口不是一个严格的CGI接口。

CGI在RFC 3875中有详细说明 ,尽pipe这是对原始NCSA文件的后期“官方”编纂。 基本上,CGI定义了一个协议,用于将来自Web服务器的HTTP请求数据传递给程序来处理任何语言的程序。 在这个规范写成的时候(1993年),大多数Web服务器只包含静态页面,“Web应用程序”是一个罕见的新事物,所以将它们与“正常”的静态内容区别开来是很自然的,例如cgi-bin目录除了静态内容,并以.cgi结尾。

在这个时候,这里也没有像PHP这样的专门的“networking编程语言”,C是主导的可移植编程语​​言 – 很多人用CG编写CGI脚本。但是Perl很快适应了这种事情,CGI几乎成了Perl的代名词。 然后,Java Servlets,PHP和其他一些公司接pipe了Perl市场份额的大部分。

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

CGI是Web服务器和程序进行通信的简单方法,没有什么比这更简单了。 这里服务器pipe理networking连接和HTTP协议,程序处理input并生成发送给浏览器的输出。 CGI脚本基本上可以是任何可以由networking服务器执行的程序,并遵循CGI协议。 因此,一个CGI程序可以被实现,例如在C中。然而这是非常罕见的,因为C不太适合这个任务。

/cgi-bin/*.cgi是一个简单的path,人们通常把他们的CGI脚本。 Web服务器通常默认configuration为从该path获取CGI脚本。

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

无论您是否已经实现了CGI脚本,都取决于您的脚本如何由Web服务器执行。

CGI本质上将请求传递给任何使用Web服务器configuration的解释器 – 这可能是Perl,Python,PHP,Ruby,C几乎任何东西。 Perl是当今最常见的背景,这就是为什么你经常参考CGI来看它。

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

CGI是由Web服务器调用外部程序来处理请求的一种机制,使用环境variables和标准input将请求数据提供给程序。 尽pipe使用某些语言编写CGI程序比较容易,但外部程序写入的确切语言并不重要。

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

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

CGI是缓慢的,因为程序(和相关的翻译)必须按请求启动。 现代的替代方法是由mod_php使用的embedded式执行,以及由FastCGI使用的长时间运行的进程。 一个给定的语言可能有自己的方式来实现这些机制,因此在使用CGI之前一定要问一下。

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

因为这一切,有很多性能,安全性,可移植性问题发挥作用。 但是,首先了解什么不是CGI是很好的,理解它是什么。

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

随着开发的进行,开发人员不再能够单独解决SQL中的复杂数据请求,例如,因为sortingalgorithmexception。

有三个明智的解决scheme:

  1. 快速和肮脏:发送未经保存的数据到PHP,在那里sorting。 显然是一个非常昂贵的解决scheme,因为每次页面被调用时都会重复这个操作
  2. 写一个插件到数据库引擎 – 但是pipe理员还没准备好允许外部代码在他们的服务器上运行,或者
  3. 您可以在程序(C,Perl等)中处理数据,并输出HTML。 程序本身进入/ cgi-bin,并被web服务器(如Apache)直接调用,而不是通过PHP。

CGI在解决scheme#3中运行脚本,并将结果输出到浏览器。 你有编译程序的速度,比SQL更好的语言的灵活性,不需要编写插件到SQL服务器。 (再次,这是一个特定于SQL和C的示例)

CGI背后的思想是程序/脚本(不pipe是Perl还是C)通过STDIN(请求数据)接收input,并通过STDOUT(echo,printf语句)输出数据。 大多数PHP脚本不具备资格的原因是因为它们在PHP Apache模块下运行。

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

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

你用什么语言编写CGI程序? 其他post已经提到c,java,php,perl等

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

CGI脚本可以从浏览器执行。 URI通常包含提供给CGI脚本的查询string。 如果方法是“get”,那么查询string被提供给名为QUERY_STRING的环境variables中的CGI脚本。 如果方法是“post”,则使用标准input将查询string提供给CGI脚本(CGI脚本从标准input中读取查询string)。

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

RFC 3875“通用网关接口(CGI)”部分定义了使用C的CGI,正如在C库例程getenv()或variables环境中访问环境variables一样。

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