当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《什么是通用网关接口(CGI)?》经验,为你挑选了11个好方法。

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

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

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

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

那么,现在PHP Script是CGI吗?因为它的网络服务器和所有其他服务器之间的接口?我不知道.有时他们称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服务器通信?IPC?并使用套接字编程与所有服务器(在我的示例MATLAB和MySQL中)连接?我迷路了!!

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

有一次,我遇到了必须给HTTP PUT请求访问Web服务器(Apache HTTPD)的情况.它很久了.所以,据我记得这就是我所做的:

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

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

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

我真的写过CGI脚本吗?

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

编辑:

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



1> Vinko Vrsalo..:

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

要使用你的图像:

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

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

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

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

所以,回答你的问题:

CGI究竟是什么?

往上看.

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

这是cgi程序的传统场所,许多Web服务器都预先配置了这个目录,可以将所有二进制文件作为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中)连接?我迷路了!

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

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

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


更具体地说,它描述了如何在环境变量(例如请求类型,远程IP地址)中传递请求信息,如何通过标准输入传递reqeust主体,以及如何通过标准输出传递响应.有关详细信息,请参阅CGI规范(http://hoohoo.ncsa.illinois.edu/cgi/).
@Michael:但是当通过mod_php运行时根本不是CGI(即使基于它).我同意CGI指的是协议和通过它执行的脚本.
PHP仍然主要依赖于CGI协议,$ _SERVER的大部分内容都直接来自CGI规范.而"CGI编程"总是意味着程序处理请求,而不是协议本身的实现.如果你向1993年的网络编程先驱解释了你用PHP做了什么,他会认为它是一种先进的(尽管可能是懦弱的)CGI编程形式.
假设图中的"服务器端程序"是我的PHP脚本.那么,我从未做过任何CGI编程?因为我从来没有写过任何介于webserver和我的PHP脚本之间的内容.该死的!!这杀了我.
@Vinko Vrsalovic:如果CGI是Perl,C或其他语言在Web服务器中执行的接口,则PHP使用哪个接口在Apache中运行?PHP是否属于CGI规范?
@Hardik:PHP可以使用CGI或特殊模块(mod_php)运行。

2> Quentin..:

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 ?? 认真?

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

我什么时候编译?

    写代码

    访问URL

    Webserver运行程序

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

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

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

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

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

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

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

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

它的最新更新是什么?

1.1



3> CB Bailey..:

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接口.


嘿..请不要删除它.它以更清晰的方式说出一些事情.我发现它很有帮助.也许其他一些人也可能会发现它.:)

4> Michael Borg..:

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

在这个时候,这里也没有专门的"网络编程语言",如PHP,而C是主流的可移植编程语​​言 - 很多人用C语言编写CGI脚本.但Perl很快就证明更适合这种类型的事情,CGI几乎成了Perl的代名词.然后是Java Servlets,PHP和其他一些人,并接管了Perl的大部分市场份额.



5> Juha Syrjälä..:

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

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

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

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

是否已实现CGI脚本取决于Web服务器如何执行脚本.



6> prodigitalso..:

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

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


不是downvoting,但大多数python web安装我见过mod_wsgi或mod_python.

7> Ignacio Vazq..:

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

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

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

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



8> denica..:

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

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



9> Michał Leon..:

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

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

有三个明智的解决方案:

    快速和脏:将未提供的数据发送到PHP,在那里排序.显然是一个非常昂贵的解决方案,因为每次调用页面时都会重复这个

    写一个插件到数据库引擎 - 但是管理员还没准备好允许外部代码在他们的服务器上运行,或者

    您可以在程序(C,Perl等)中处理数据,并输出HTML.程序本身进入/ cgi-bin,由Web服务器(例如Apache)直接调用,而不是通过PHP调用.

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



10> user34660..:

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()或变量environ"访问一样.

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



11> 小智..:

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

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

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

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有