上一页 下一页

CGI脚本如何工作

作者: Marshall Brain

简单的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.cgicount.txt放入cgi-bin目录,您可以运行该脚本。该脚本所做的只是生成一个显示“当前计数为:X”的页面,其中X在您每次运行脚本时递增一次。尝试运行几次,并观察页面内容的变化!

count.txt文件保存当前计数,而小的incrementcount()函数是用于递增count.txt文件中计数的函数。此函数打开count.txt文件,从中读取数字,递增数字并将其写回文件。该函数实际上会尝试打开文件两次。这样做是为了防止两个人同时访问文件。这当然不是一个万无一失的技术,但对于如此简单的操作来说是可行的。如果文件在第二次尝试时仍无法打开,则返回给调用者错误值-1。更复杂的程序会识别-1的返回值并生成适当的错误消息。