CGI是啥?通用网关接口,他的用途是啥,用在哪里
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CGI是啥?通用网关接口,他的用途是啥,用在哪里相关的知识,希望对你有一定的参考价值。
参考技术ACGI(common gate internetgace)通用网关接口,是一段程序服务器上供客户端html页面的接口。
通俗讲CGI就像是一座桥,网页和 WEB服务器中的执行程序连接起来,把HTML接受的指令传递给服务器,把服务器执行的结果返还给HTML页;CGI可以实现处理表格,数据库查询,送电子邮件等许多操作,常见的CGI就是计数器。CGI使网页变得不是静态的,是交互式的。
扩展资料:
CGI可以为我们提供许多HTML无法做到的功能。
比如 a是一个记数器, b是顾客信息表格的提交以及统计, c是搜索程序, d是WEB数据库,用Html是没有办法记住客户的任何信息的,就算用户愿意让你知道。
用Html也是无法把信息记录到某一个特定文件里的。要把客户端的信息记录在服务器的硬盘上,就要用到CGI。这是CGI最重要的作用,它补充了Html的不足。是的,仅仅是补充,不是替代。
使在网络服务器下运行外部分应用程序(或网关)成为可能。CGI-BIN 目录是存放CGI脚本的地方。这些脚本使Web服务器和浏览器能运行外部程序,而无需启动另一个程序。
它是运行在Web服务器上的一个程序,并由来自于浏览者的输入触发。CGI是在HTTP服务器下运行外部程序(或网关)的一个接口,它能让网络用户访问远程系统上的使用类型程序,就好像他们在实际使用那些远程计算机一样。
参考资料来源:百度百科—CGI
什么是通用网关接口 (CGI)?
【中文标题】什么是通用网关接口 (CGI)?【英文标题】:What is Common Gateway Interface (CGI)? 【发布时间】:2011-01-06 13:14:50 【问题描述】:CGI 是一个通用网关接口。顾名思义,它是所有事物的“通用”网关接口。从名字上看,它是如此的琐碎和幼稚。我觉得我理解了这一点,每次遇到这个词时我都有这种感觉。但坦率地说,我没有。我仍然很困惑。
我是一名具有 Web 开发经验的 PHP 程序员。
用户(客户端)对页面的请求 ---> webserver(->嵌入式 PHP 解释器)----> 服务器端(PHP)脚本 ---> MySQL 服务器。
现在说我的 PHP 脚本可以从 MySQL 服务器和 MATLAB 服务器和其他一些服务器获取结果。
那么,现在 PHP 脚本就是 CGI 了吗?因为它的网络服务器和所有其他服务器之间的接口?我不知道。有时他们称 CGI 为一种技术,有时他们称 CGI 为程序或其他服务器。
究竟什么是 CGI?
/cgi-bin/*.cgi
有什么大不了的?这是怎么回事?我不知道服务器上的这个cgi-bin
目录是干什么用的。我不知道他们为什么有 *.cgi 扩展名。
为什么 Perl 总是碍手碍脚。 CGI 和 Perl(语言)。我也不知道这两个是怎么回事。几乎所有的时间我都听到这两个组合“CGI & Perl”。这本书是另一个很好的例子CGI Programming with Perl。为什么不“使用 PHP/JSP/ASP 进行 CGI 编程”?我从来没有见过这样的事情。
CGI 编程,让我很困惑。 “在 C 中”??严重地??我不知道该说些什么。我只是困惑。 “在 C 中”??这改变了一切。程序需要编译和执行。这完全改变了我对 Web 编程的看法。我什么时候编译?程序是如何执行的(因为它是机器码,所以它必须作为一个独立的进程执行)。它如何与 Web 服务器通信?工控机?并使用套接字编程与所有服务器(在我的示例 MATLAB 和 MySQL 中)连接?我迷路了!!
人们说 CGI 已被弃用并且不再使用。是这样吗?最新的更新是什么?
我真的写过 CGI 脚本吗?有一次,我遇到了一种情况,我 必须授予 HTTP PUT 请求访问权限 网络服务器(Apache HTTPD)。它很长 背部。所以,据我所知,这是 我做了什么:
编辑了 Apache HTTPD 的配置文件,告诉 webserver 通过 所有 HTTP PUT 请求
put.php
(我必须写这个 PHP 脚本)实现 put.php 处理请求(将文件保存到该位置 提到)
人们说我写了一个 CGI 脚本。 说真的,我不知道是什么 他们在谈论。
我希望你明白我的困惑是什么。 (因为我自己不知道我在哪里感到困惑)。我要求你们尽可能简单地回答。我真的无法理解任何花哨的技术术语。至少在这种情况下不会。
编辑:
我发现了这个很棒的教程"CGI Programming Is Simple!" - CGI Tutorial,它以最简单可能的方式解释了这些概念。阅读本文后,您可能想阅读Getting Started with CGI Programming in C 以补充您对实际代码示例的理解。我还将本教程的这些链接添加到 Wikipedia 的文章中:http://en.wikipedia.org/wiki/Common_Gateway_Interface
【问题讨论】:
我已经看过用 Cobol 编写的 CGI。不开玩笑! @Luc M. 有兴趣。您指的是哪个 CGI(假设 LINQ 中存在光线投射器......)? @claws:人们,主要是老派,将调用任何代码,无论实际执行方法如何,通过网络服务器执行 CGI。您实际编写的是一个 PHP 脚本,它可能会或可能不会通过 CGI 协议执行。您的困惑似乎源于 CGI 的矛盾含义,即执行代码的协议和通过协议执行的代码(后来被概括为任何网络执行的代码) 90 年代中期,我在 HyperCard 中编写了几个 CGI 脚本 @Joe 我从来没有收到过通知,今天,再次阅读这篇文章,我看到了你的问题。 CGI 是作为独立的可执行文件在 OpenVMS 上编写的(不涉及框架或第三方应用程序......) 【参考方案1】:CGI 是一个接口,它告诉网络服务器如何将数据传入和传出应用程序。更具体地说,它描述了如何在环境变量中传递请求信息(如请求类型、远程 IP 地址),如何通过标准输入传递请求体,以及如何通过标准输出传递响应。详情可以参考CGI specification。
使用您的图片:
user (client) request for page ---> webserver ---[CGI]----> Server side Program ---> MySQL Server.
大多数(如果不是全部)网络服务器可以配置为将程序作为“CGI”执行。这意味着网络服务器在收到请求后,会将数据转发到特定程序,设置一些环境变量并通过标准输入和标准输出编组参数,以便程序知道在哪里寻找什么。
主要好处是您可以从网络上运行任何可执行代码,前提是网络服务器和程序都知道 CGI 是如何工作的。这就是为什么您可以使用 C 或 Bash 使用常规的启用 CGI 的 Web 服务器编写 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 是古老的(比 PHP、JSP 和 ASP 更早,它们都是在 CGI 已经过时时出现的,Perl 在 CGI 新出现的时候就已经存在)并且因为它是一种通过 CGI 为动态网页提供服务的非常好的语言而闻名.现在还有其他替代方法可以在网络服务器中运行 Perl,主要是 mod_perl。
C 中的 CGI 编程这让我很困惑。在 C??严重地??我不知道该说些什么。我只是感到困惑。“在 C 中”??这改变了一切。程序需要编译和执行。这完全改变了我对 Web 编程的看法。我什么时候编译?程序是如何执行的(因为它将是一个机器代码,所以它必须作为一个独立的进程执行)。它如何与 Web 服务器通信?IPC?以及使用套接字编程与所有服务器(在我的示例 MATLAB 和 MySQL 中)接口?我迷路了!!
您编译一次可执行文件,网络服务器执行程序并将请求中的数据传递给程序并输出接收到的响应。 CGI 指定每个请求将启动一个程序实例。这就是为什么现在 CGI 效率低下而且有点过时的原因。
他们说 CGI 已被弃用。它不再使用了。是这样吗?它的最新更新是什么?
当性能不是最重要的并且需要一种简单的执行代码的方法时,仍然使用 CGI。由于前面所述的原因,它效率低下,并且有更现代的方法可以在 Web 环境中执行任何程序。目前最著名的是FastCGI。
【讨论】:
更具体地说,它描述了请求信息是如何在环境变量中传递的(如请求类型、远程IP地址),reqeust body是如何通过标准输入传入的,以及响应是如何传出的通过标准输出。具体可以参考CGI规范(hoohoo.ncsa.illinois.edu/cgi)。 假设你图中的Server side Program
是我的PHP脚本。所以,我从来没有做过任何 CGI 编程吗?因为我从来没有写过任何介于网络服务器和我的 PHP 脚本之间的东西。该死!!这要了我的命。
PHP 仍然在很大程度上基于 CGI 协议,$_SERVER 的大部分内容直接来自 CGI 规范。而“CGI 编程”总是指处理请求的程序,而不是协议本身的实现。如果您向 1993 年的 Web 编程先驱解释您使用 PHP 所做的事情,他会认为它是一种高级(尽管可能很笨拙)的 CGI 编程形式。
@Michael:但是通过 mod_php 运行时根本不是 CGI(即使基于它)。我同意 CGI 指的是协议和通过它执行的脚本。
@Vinko Vrsalovic:如果 CGI 是 Perl、C 或其他语言在 Web 服务器中执行的接口,而不是 PHP 使用哪个接口在 Apache 中运行??????? PHP 是否属于 CGI 规范??【参考方案2】:
CGI 到底是什么?
Web 服务器从程序(而不是文件)获取数据的一种方式。
/cgi-bin/*.cgi 有什么大不了的?
没什么大不了的。这只是一个约定。
我不知道服务器上的这个 cgi-bin 目录是干什么用的。 我不知道他们为什么有 *.cgi 扩展名。
服务器必须知道如何处理文件(即,将其视为要执行的程序,而不是简单地提供服务)。拥有 .html 扩展名会告诉它使用 text/html 内容类型。拥有 .cgi 扩展名会告诉它以程序的形式运行。
将可执行文件保存在单独的目录中可以提供一些额外的保护,防止执行不正确的文件和/或将 CGI 程序作为原始数据提供,以防服务器配置错误。
为什么 Perl 总是碍手碍脚。
它没有。 Perl 与 CGI 同时大受欢迎。
我已经多年没有使用 Perl CGI。我使用 mod_perl 很长时间了,现在倾向于 PSGI/Plack 和 FastCGI。
这本书是另一个用 Perl 进行 CGI 编程的好例子 为什么不使用“使用 PHP/JSP/ASP 进行 CGI 编程”。
CGI 效率不高。与来自网络服务器的程序对话的更好方法与 PHP 几乎同时出现。 JSP 和 ASP 是与程序对话的不同方法。
C 中的 CGI 编程这让我很困惑。在 C??认真的吗??
它是一种编程语言,为什么不呢?
什么时候编译?
-
编写代码
编译
访问网址
网络服务器运行程序
程序是如何执行的(因为它是机器码,所以必须作为一个独立的进程来执行)。
它不必作为一个独立的进程执行(你可以用 C 编写 Apache 模块),但 CGI 的整个概念是它启动一个外部进程。
它如何与网络服务器通信?工控机?
STDIN/STDOUT 和环境变量——在 CGI 规范中定义。
并使用套接字与所有服务器(在我的示例 MATLAB 和 MySQL 中)进行交互 编程?
使用您喜欢和支持的任何方法。
他们说 CGI 贬值了。它不再使用了。是这样吗?
CGI 效率低下、缓慢且简单。很少用,用的时候,就是因为简单。如果性能不是什么大问题,那么简单就很有价值。
它的最新更新是什么?
1.1
【讨论】:
1.编写代码 2. 编译 3. 访问 URL 4. Webserver 运行程序。 || 但是如何网络服务器知道在哪里你放置编译的可执行程序?它如何知道要运行哪个可执行程序(其中包括)? @Pacerier — 与请求静态文件时知道将哪个静态文件发送给客户端的方式相同。【参考方案3】:CGI 是 Web 服务器(HTTP 服务器)和处理特定请求的某种类型的可执行程序之间的接口规范。
它描述了该请求的某些属性应如何传达给该程序的环境,以及该程序应如何将响应传回服务器,以及服务器应如何“完成”响应以形成对原始响应的有效回复HTTP 请求。
有一段时间,CGI 是 IETF 互联网草案,因此有一个到期日。它没有更新就过期了,所以没有 CGI“标准”。它现在是一个信息 RFC,但它记录了常见的做法,本身并不是一个标准。 rfc3875.txt, rfc3875.html
实现 CGI 接口的程序可以用任何可在目标机器上运行的语言编写。他们必须能够访问环境变量,通常是标准输入,并且他们在标准输出上生成他们的输出。
C 等编译语言和 perl 等脚本语言一样常用,通常使用库来更轻松地访问 CGI 环境。
CGI 的一大缺点是会为每个请求生成一个新程序,因此在请求之间保持状态可能是一个主要的性能问题。状态可能在 cookie 中处理或在 URL 中编码,但如果它变得很大,则必须将其存储在其他地方并从编码的 url 信息或 cookie 中键入。然后,每次 CGI 调用都必须从某处的存储中重新加载存储的状态。
出于这个原因,以及请求和会话的非常简单的接口,Web 服务器和应用程序之间更好的集成环境更受欢迎。像使用 apache 的现代 php 实现这样的环境将目标语言与 Web 服务器更好地集成在一起,并提供对有效服务 http 请求所需的请求和会话对象的访问。它们提供了一种更简单、更丰富的方式来编写“程序”来处理 HTTP 请求。
您是否编写 CGI 脚本取决于解释。它确实完成了一项工作,但更常见的是将 php 作为一个模块运行,其中脚本和服务器之间的接口并不是严格意义上的 CGI 接口。
【讨论】:
麻烦。当没有其他答案时,我开始写这篇文章,但被称为方式。现在它在列表中排名第 8 位。我现在没有删除它的意愿,我稍后会回来删除它。 嘿..请不要删除它。它以更清晰的方式说明了一些事情。我发现它很有帮助。可能其他一些人也可能会这样认为。 :) 好的,我暂时搁置一下。不过,如果有人将任何“更好”的段落整合到更完整的答案之一中,那可能会很好。那么我们可能会得到一个更明确的答案。【参考方案4】:CGI 在RFC 3875 中指定,尽管这是后来对原始NCSA document 的“官方”编码。基本上,CGI 定义了一种协议,用于将有关 HTTP 请求的数据从网络服务器传递到要处理的程序——任何程序,任何语言。在编写规范时(1993 年),大多数 Web 服务器只包含静态页面,“Web 应用程序”是一种罕见的新事物,因此将它们与“正常”静态内容分开似乎很自然,例如在cgi-bin
目录与静态内容分开,并以.cgi
结尾。
此时,这里还没有像 PHP 这样的专用“Web 编程语言”,而 C 是占主导地位的可移植编程语言 - 很多人用 C 编写 CGI 脚本。但 Perl 很快证明更适合这种事情,CGI 一度几乎成了 Perl 的代名词。然后出现了 Java Servlet、PHP 和其他一大堆,并占据了 Perl 的大部分市场份额。
【讨论】:
为什么 PHP 是一种“专用的 Web 编程语言”? PHP 是一种通用语言,people 也将其用于 UI 应用程序。 @Pacerier:它被设计成一种用于生成网页的编程语言,这也是 99.9% 的用户使用它的目的。它甚至在它的名称中。声称其他任何事情都是毫无意义的。如果您将它用于 UI 应用程序、科学计算或嵌入式编程,那很好,很高兴,没有人说您不允许这样做。【参考方案5】:查看***中的CGI。 CGI 是 Web 服务器和外部程序或脚本之间的协议,它处理输入并生成发送到浏览器的输出。
CGI 是 Web 服务器和程序进行通信的一种简单方式,仅此而已。在这里,服务器管理网络连接和 HTTP 协议,程序处理输入并生成发送到浏览器的输出。 CGI 脚本基本上可以是任何可以由网络服务器执行并遵循 CGI 协议的程序。因此,CGI 程序可以在例如 C 中实现。但是这种情况极为罕见,因为 C 不太适合该任务。
/cgi-bin/*.cgi
是人们通常放置 CGI 脚本的简单路径。 Web 服务器通常默认配置为从该路径获取 CGI 脚本。
CGI 脚本也可以用 PHP 实现,但所有 PHP 程序都不是 CGI 脚本。如果 webserver 嵌入了 PHP 解释器(例如 Apache 中的 mod_php),那么 CGI 阶段会被 web server 和解释器之间更有效的直接协议跳过。
您是否实现了 CGI 脚本取决于您的脚本是如何被 Web 服务器执行的。
【讨论】:
【参考方案6】:CGI 本质上将请求传递给配置了 Web 服务器的 任何 解释器 - 这可能是 Perl、Python、PHP、Ruby、C 几乎任何东西。 Perl 在当时是最常见的,这就是为什么你经常在 CGI 中看到它。
CGI 没有死。事实上,大多数大型托管公司将 PHP 作为 CGI 运行,而不是 mod_php,因为它提供用户级配置和其他一些东西,但比 mod_php 慢。 Ruby 和 Python 通常也作为 CGI 运行。它们的主要区别在于服务器模块作为实际服务器软件的一部分运行 - 与 CGI 一样,它完全在服务器之外服务器只使用 CGI 模块来确定如何将数据传递和接收到外部解释器。
【讨论】:
不反对,但我在 mod_wsgi 或 mod_python 上看到了大多数 python 网络安装。 这就是大多数人使用 CGI 脚本这个术语的方式,但这并不是这个术语的真正含义。 你说的是解释器但是C很少被解释和编译的程序比如C编译的程序可以用于CGI。【参考方案7】:CGI 是一种机制,通过该机制,Web 服务器调用外部程序来处理请求,环境变量和标准输入用于将请求数据提供给程序。编写外部程序的确切语言无关紧要,尽管用某些语言编写 CGI 程序比用其他语言更容易。
由于 CGI 脚本需要执行权限,httpd 默认只允许运行 cgi-bin
目录中的 CGI 程序,以实现(现在可能被误导)安全目的。
大多数 PHP 脚本通过 mod_php
在 Web 服务器进程中运行。这不是 CGI。
CGI 很慢,因为程序(和相关的解释器)必须根据请求启动。现代替代方案是 mod_php 使用的嵌入式执行和 FastCGI 使用的长时间运行的进程。一种给定的语言可能有自己的方式来实现这些机制,所以在求助于 CGI 之前一定要四处询问。
【讨论】:
@Ignacio Vazquez-Abrams:如果 CGI 接口创建一个新进程,那么每次它收到对 CGI 资源的请求时,CGI 和 mod_php 之间的执行差异是多少?????? CGI 和 mod_php 是一样的吗???或者是否可以编写在 CGI 接口而不是 mod_php 下运行的 PHP 脚本??? @Hardik:mod_php 作为 HTTPd 的一部分运行,它负责自己的进程。 这个“外部程序”是什么?如果我用 php-fpm 运行 php,它是一个解释器吗? @slier:这是一个任意程序,不是网络服务器。【参考方案8】:一个真实的例子:需要在网站上显示的复杂数据库。由于数据库是在 1986 年左右设计的(!),大量数据以不同的方式打包以节省磁盘空间。
随着开发的进行,开发人员不再能够仅用 SQL 解决复杂的数据请求,例如排序算法不寻常。
有三个明智的解决方案:
-
又快又脏:将未排序的数据发送到 PHP,在那里进行排序。显然是一个非常昂贵的解决方案,因为每次调用页面时都会重复此操作
为数据库引擎编写一个插件——但管理员还没有准备好允许外部代码在他们的服务器上运行,或者
您可以在程序(C、Perl 等)中处理数据,并输出 HTML。程序本身进入 /cgi-bin,并由 Web 服务器(例如 Apache)直接调用,而不是通过 PHP。
CGI 在解决方案 #3 中运行您的脚本并将效果输出到浏览器。你拥有编译程序的速度,比 SQL 更好的语言的灵活性,并且无需编写插件到 SQL 服务器。 (同样,这是一个特定于 SQL 和 C 的示例)
【讨论】:
对我来说最好的答案,我知道了。【参考方案9】:您可能想知道什么不是 CGI,答案是您的 Web 服务器的 MODULE(如果我假设您正在运行 Apache)。这是最大的不同,因为 CGI 需要外部程序、线程以及任何实例化 PERL、PHP、C 应用程序服务器的东西,当您作为 MODULE 运行时,该程序本身就是 Web 服务器 (apache)。
由于所有这些,都会出现很多性能、安全性和可移植性问题。但最好先了解什么不是 CGI,然后再了解它是什么。
【讨论】:
【参考方案10】: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”属性中指定的 URI 将被发送到服务器,表单中的数据作为查询字符串发送。如果“action”指定了一个 CGI 脚本,那么 CGI 脚本将被执行,然后生成一个 HTML 页面。
RFC 3875“通用网关接口 (CGI)”部分定义了使用 C 的 CGI,如说环境变量“由 C 库例程 getenv() 或变量 environ 访问”。
如果您正在使用 C/C++ 开发 CGI 脚本并使用 Microsoft Visual Studio 来执行此操作,那么您将开发一个控制台程序。
【讨论】:
“CGI 脚本”是一个广义术语,也可以包括可执行文件。【参考方案11】:CGI 是您编写的程序(或 Web API),并将其保存在 Web 服务器站点上。 CGI 是一个文件。
此文件位于 Web 服务器上并等待。当客户端浏览器向 Web 服务器发送请求以执行您的 CGI 文件时,Web 服务器在服务器站点上运行您的 CGI 文件。此 CGI 程序的输入(如果有)来自客户端浏览器。这个 CGI 程序的输出被发送到浏览器。
您使用什么语言编写 CGI 程序?其他帖子已经提到了c、java、php、perl等。
【讨论】:
我们可以这样说class PHP implements CGI
吗?【参考方案12】:
CGI 背后的想法是程序/脚本(无论是 Perl 还是 C)通过 STDIN
(请求数据)接收输入,并通过 STDOUT
(echo、printf
语句)输出数据。
大多数 PHP 脚本不符合条件的原因是它们在 PHP Apache 模块下运行。
【讨论】:
以上是关于CGI是啥?通用网关接口,他的用途是啥,用在哪里的主要内容,如果未能解决你的问题,请参考以下文章