简单的CGI脚本
假设您可以访问 cgi-bin 目录(参见上一节),并且您了解C编程语言或PERL,那么您可以通过CGI进行一系列有趣的实验,从而入门。让我们从创建最简单的CGI脚本开始。
在文章网页如何工作中,我们研究了最简单的HTML网页。它看起来像这样:
广告
<html> <body> <h1>Hello there!</h1> </body> </html>
最简单的CGI脚本在执行时会将其输出创建为此简单、静态页面。如果您用C语言编写此CGI程序,它将如下所示:
#include <stdio.h> int main() { printf("Content-type: text/html\n\n"); printf("<html>\n"); printf("<body>\n"); printf("<h1>Hello there!</h1>\n"); printf("</body>\n"); printf("</html>\n"); return 0; }
在我的Web服务器上,我将此程序输入到文件simplest.c中,然后通过以下命令编译它:
gcc simplest.c -o simplest.cgi
(参见C语言编程如何工作了解C程序编译的详细信息。)
将simplest.cgi放入cgi-bin目录后,即可执行。如您所见,该脚本所做的只是生成一个显示“Hello there!”的页面。唯一出人意料的部分是以下行:
printf("Content-type: text/html\n\n");
“Content-type: text/html\n\n”这一行是特殊文本,必须是任何CGI脚本发送给浏览器的第一项内容。只要您记住这样做,一切都会正常。如果您忘记了,浏览器将拒绝该脚本的输出。
您可以在PERL中执行相同的操作。将此PERL代码输入到名为simplest.pl的文件中:
#! /usr/bin/perl print "Content-type: text/html\n\n"; print "<html><body><h1>Hello World!"; print "</h1></body></html>\n";
将文件放入您的cgi-bin目录。在UNIX机器上,您可能还需要输入:
chmod 755 simplest.pl
这告诉UNIX该脚本是可执行的。
您刚刚了解了CGI脚本的基本思想。它就是这么简单!一个程序执行后,其输出会发送给调用该脚本的浏览器。发送到标准输出(stdout)的普通输出就是发送到浏览器的内容。
然而,CGI脚本的全部目的在于创建动态内容——每次脚本执行时,输出都应该不同。毕竟,如果每次运行脚本输出都相同,那么您不如直接使用静态页面。下面的C程序演示了一个非常简单的动态内容:
#include <stdio.h> int incrementcount() { FILE *f; int i; f=fopen("count.txt", "r+"); if (!f) { sleep(1); f=fopen("count.txt", "r+"); if (!f) return -1; } fscanf(f, "%d", &i); i++; fseek(f,0,SEEK_SET); fprintf(f, "%d", i); fclose(f); return i; } int main() { printf("Content-type: text/html\n\n"); printf("<html>\n"); printf("<body>\n"); printf("<h1>The current count is: ") printf("%d</h1>\n", incrementcount()); printf("</body>\n"); printf("</html>\n"); return 0; }
使用文本编辑器,将此程序输入到名为count.c的文件中。通过输入以下命令进行编译:
gcc count.c -o count.cgi
创建另一个名为count.txt的文本文件,并在其中放置一个零。通过将counter.cgi和count.txt放入cgi-bin目录,您可以运行该脚本。该脚本所做的只是生成一个显示“当前计数为:X”的页面,其中X在您每次运行脚本时递增一次。尝试运行几次,并观察页面内容的变化!
count.txt文件保存当前计数,而小的incrementcount()函数是用于递增count.txt文件中计数的函数。此函数打开count.txt文件,从中读取数字,递增数字并将其写回文件。该函数实际上会尝试打开文件两次。这样做是为了防止两个人同时访问文件。这当然不是一个万无一失的技术,但对于如此简单的操作来说是可行的。如果文件在第二次尝试时仍无法打开,则返回给调用者错误值-1。更复杂的程序会识别-1的返回值并生成适当的错误消息。