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服务器从程序(而不是,例如,一个文件)中获取数据的方法。

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

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

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

服务器必须知道如何处理该文件(即将其视为要执行的程序,而不是简单地提供的东西)。拥有.html扩展名告诉它使用text/html内容类型。使用.cgi扩展名可以让它作为程序运行。

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

为什么Perl总是碍事。

它不是。Perl和CGI在同一时期非常流行。

我已经很多年没用过Perl CGI了。我使用mod_perl很长一段时间了,现在倾向于使用PSGI/Plack和FastCGI。

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

CGI的效率不是很高。与PHP同时出现了与web服务器上的程序进行通信的更好方法。JSP和ASP是与程序对话的不同方法。

C语言的CGI编程让我很困惑。在C ? ?严重吗? ?

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

什么时候编译?

编写代码 编译 访问URL web服务器运行程序

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

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

它如何与web服务器通信?IPC吗?

STDIN/STDOUT和环境变量-在CGI规范中定义。

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

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

他们说CGI被贬低了。它不再被使用了。是这样吗?

CGI效率低,速度慢,而且简单。它很少被使用,当它被使用时,那是因为它简单。如果性能不是一个大问题,那么简单性就很有价值。

它的最新更新是什么?

1.1

其他回答

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是一个接口,它告诉web服务器如何向应用程序传递数据和从应用程序传递数据。更具体地说,它描述了如何在环境变量中传递请求信息(如请求类型、远程IP地址)、如何通过标准输入传入请求正文,以及如何通过标准输出传递响应。您可以参考CGI规范了解详细信息。

要使用您的图像:

用户(客户端)请求页面——> webserver——[CGI]---->服务器端程序——> MySQL服务器。

大多数(如果不是全部的话)网络服务器都可以配置为执行“CGI”程序。这意味着web服务器在接收到请求后,会将数据转发给特定的程序,设置一些环境变量,并通过标准输入和标准输出编组参数,这样程序就可以知道在哪里和寻找什么。

主要的好处是你可以从网络上运行任何可执行代码,前提是网络服务器和程序都知道CGI是如何工作的。这就是为什么你可以用C或Bash编写web程序,并使用常规的启用cgi的web服务器。而且大多数编程环境都可以轻松地使用标准输入、标准输出和环境变量。

在你的例子中,你很可能使用了另一种特定于PHP的方式,在你的脚本和web服务器之间进行通信,正如你在你的问题中提到的,这是一个名为mod_php的嵌入式解释器。

所以,回答你的问题:

CGI到底是什么?

见上图。

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

这是cgi程序的传统位置,许多web服务器都预先配置了这个目录,以执行所有二进制文件作为cgi程序。. CGI扩展名表示期望通过CGI工作的可执行文件。

为什么Perl总是碍事。CGI和Perl(语言)。我也不知道这两个是怎么回事。几乎所有的时间,我都听到这两者结合在一起“CGI和Perl”。这本书是另一个很好的例子CGI编程与Perl为什么不“CGI编程与PHP/JSP/ASP”。我从未见过这样的事情。

因为Perl是古老的(比PHP、JSP和ASP都要古老,这些都是在CGI诞生的时候出现的,而Perl是在CGI诞生的时候存在的),并且作为一种通过CGI提供动态网页的非常好的语言而闻名。现在,在web服务器上运行Perl还有其他选择,主要是mod_perl。

CGI Programming in C this 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!!

只需编译一次可执行文件,web服务器就会执行程序,并将请求中的数据传递给程序,并输出接收到的响应。CGI指定每个请求将启动一个程序实例。这就是为什么CGI现在效率很低,而且有点过时。

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

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

CGI本质上是将请求传递给任何配置了web服务器的解释器-这可能是Perl, Python, PHP, Ruby, C几乎任何东西。Perl在过去是最常见的,这就是为什么你经常在CGI中看到它。

CGI并没有死。事实上,大多数大型托管公司将PHP作为CGI而不是mod_php运行,因为它提供用户级配置和其他一些东西,而它比mod_php慢。Ruby和Python通常也以CGI的形式运行。这里的关键区别是服务器模块作为实际服务器软件的一部分运行,而与CGI一样,它完全在服务器之外。服务器只是使用CGI模块来决定如何向外部解释器传递和接收数据。

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

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

有三个明智的解决方案:

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

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

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

CGI只是网络服务器和程序进行通信的一种简单方式,仅此而已。在这里,服务器管理网络连接和HTTP协议,程序处理输入并生成发送到浏览器的输出。CGI脚本基本上可以是任何可以由web服务器执行并遵循CGI协议的程序。因此,一个CGI程序可以实现,例如,在C。但这是极其罕见的,因为C不是很适合这项任务。

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

CGI脚本也可以在PHP中实现,但并非所有PHP程序都是CGI脚本。如果web服务器有嵌入式PHP解释器(例如Apache中的mod_php),那么web服务器和解释器之间更有效的直接协议跳过了CGI阶段。

你是否实现了CGI脚本取决于你的脚本是如何被web服务器执行的。