CGI是一个公共网关接口。顾名思义,它是所有东西的“通用”网关接口。从名字上看,它是如此的琐碎和幼稚。我觉得我明白了,每次遇到这个词我都有这种感觉。但坦白说,我没有。我还是很困惑。

我是一个有网页开发经验的PHP程序员。

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

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

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

What exactly is CGI? Whats the big deal with /cgi-bin/*.cgi? What's up with this? I don't know what is this cgi-bin directory on the server for. I don't know why they have *.cgi extensions. Why does Perl always comes in the way. CGI & Perl (language). I also don't know what's up with these two. Almost all the time I keep hearing these two in combination "CGI & Perl". This book is another great example CGI Programming with Perl. Why not "CGI Programming with PHP/JSP/ASP"? I never saw such things. CGI Programming in C, confuses me a lot. "in C"?? Seriously?? I don't know what to say. I'm just confused. "in C"?? This changes everything. Program needs to be compiled and executed. This entirely changes my view of web programming. When do I compile? How does the program gets executed (because it will be a machine code, so it must execute as a independent process). How does it communicate with the web server? IPC? and interfacing with all the servers (in my example MATLAB & MySQL) using socket programming? I'm lost!! People say that CGI is deprecated and isn't in use anymore. Is that so? What is the latest update?

Once, I ran into a situation where I had to give HTTP PUT request access to web server (Apache HTTPD). Its a long back. So, as far as I remember this is what I did: Edited the configuration file of Apache HTTPD to tell webserver to pass all HTTP PUT requests to some put.php ( I had to write this PHP script) Implement put.php to handle the request (save the file to the location mentioned) People said that I wrote a CGI Script. Seriously, I didn't have a clue what they were talking about.

我真的写了CGI脚本吗?

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

编辑:

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


当前回答

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

由于这一切,有很多性能、安全性、可移植性问题开始发挥作用。但是最好先知道什么不是CGI,理解它是什么。

其他回答

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

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

大多数PHP脚本不合格的原因是它们是在PHP Apache模块下运行的。

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

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

有三个明智的解决方案:

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

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

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

由于这一切,有很多性能、安全性、可移植性问题开始发挥作用。但是最好先知道什么不是CGI,理解它是什么。

A CGI script is a console/shell program. In Windows, when you use a "Command Prompt" window, you execute console programs. When a web server executes a CGI script it provides input to the console/shell program using environment variables or "standard input". Standard input is like typing data into a console/shell program; in the case of a CGI script, the web server does the typing. The CGI script writes data out to "standard output" and that output is sent to the client (the web browser) as a HTML page. Standard output is like the output you see in a console/shell program except the web server reads it and sends it out.

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

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来完成,那么你将开发一个控制台程序。