首页 文章

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

提问于
浏览
707

CGI是一个通用网关接口 . 顾名思义,它是一个“通用”网关接口 . 这个名字太琐碎,天真 . 我觉得我理解这一点,每次遇到这个词时我都会感受到这一点 . 但坦率地说,我没有 . 我还是很困惑 .

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

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

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

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

  • 究竟什么是CGI?

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

  • 为什么Perl总是挡路 . CGI和Perl(语言) . 我也不喜欢这两个 . 几乎所有的时间我都会一直听到这两个组合"CGI & Perl" . 这本书是另一个很好的例子CGI Programming with Perl . 为什么不"CGI Programming with PHP/JSP/ASP"?我从未见过这样的事情 .

  • CGI Programming in C ,让我很困惑 . “ in C "?? Seriously?? I don't know what to say. I'm just confused. " in C ”??这改变了一切 . 程序需要编译和执行 . 这完全改变了我对网络编程的看法 . 我什么时候编译?如何执行程序(因为它将是一个机器代码,因此它必须作为一个独立的进程执行) . 它如何与Web服务器通信? IPC?并使用套接字编程与所有服务器(在我的示例MATLAB和MySQL中)连接?我迷路了!!

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

有一次,我遇到了一种必须给HTTP PUT请求访问Web服务器(Apache HTTPD)的情况 . 它很久了 . 所以,据我记得这就是我所做的:编辑Apache HTTPD的配置文件告诉webserver将所有HTTP PUT请求传递给一些put.php(我必须编写这个PHP脚本)实现put.php来处理请求(将文件保存到提到的位置)人们说我写了一个CGI脚本 . 说真的,我不知道他们在说什么 .

  • 我真的写过CGI脚本吗?

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

EDIT:

我找到了这个惊人的教程"CGI Programming Is Simple!" - CGI Tutorial,它以 simplest 可能的方式解释了这些概念 . 阅读本文后,您可能需要阅读Getting Started with CGI Programming in C以补充您对实际代码示例的理解 . 我've also added these links to this tutorial to Wikipedia'的文章:http://en.wikipedia.org/wiki/Common_Gateway_Interface

12 回答

  • 13

    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的脚本和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 .

  • 17

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

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

  • 6

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

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

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

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

    诸如C之类的编译语言通常被用作脚本语言,例如perl,通常使用库来更容易地访问CGI环境 .

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

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

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

  • 61

    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执行此操作,那么您将开发一个控制台程序 .

  • 4

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

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

    有三个明智的解决方案:

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

    • 将插件写入数据库引擎 - 但管理员尚未准备好允许外部代码运行在他们的服务器上,或

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

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

  • 11

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

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

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

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

  • 5

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

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

  • 5

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

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

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

  • 403

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

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

  • 40

    究竟什么是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 ??认真?

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

    我什么时候编译?

    • 编写代码

    • 编译

    • 访问URL

    • Webserver运行程序

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

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

    它是如何沟通的与Web服务器? IPC?

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

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

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

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

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

    它的最新更新是什么?

    1.1

  • 11

    在维基百科中查看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服务器如何执行脚本 .

  • 7

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

相关问题