本篇是系列文章中的第二篇,讲述大名鼎鼎的CGI技术。CGI 全称为Common Gateway Interface (通用网关接口),目的是能够让服务器能够方便的调用外部程序。CGI本身是一套协议和规范,原则上只要是拥有读写文件功能的编程语言都可以用来编写CGI程序,例如C,C++,Perl,Visual Basic,Shell等等,历史上用来编写CGI程序使用最广泛的是Perl语言,连PHP一开始也是用Perl编写的,估计也受这个传统的影响。服务器在认为这是一个CGI请求时,会调用相关CGI程序,并通过环境变量和标准输出将数据传送给CGI程序,CGI程序处理完数据,生成html,然后再通过标准输出将内容返回给服务器,服务器再将内容交给用户,CGI进程退出,在这个过程中,服务器的标准输出对应了CGI程序的标准输入,CGI程序的标准输出对应着服务器的标准输入,相当于利用两条管道建立了进程间的通信。
在今天的网站中,偶尔还能看到CGI的身影,比如Apache的下载页: http://httpd.apache.org/download.cgi
下面是用C编写的一个CGI小程序,向服务器返回数据只需要将数据写入标准输出即可,可见CGI程序的编写也是相当容易的:
cgi.c :
#include
int main()
{
char MimeType[]="text/html";
fprintf(stdout, "Content-type: %s\r\n\r\n", MimeType); //输出响应头,响应头之后要加两个"\r\n"
fprintf(stdout, "CGI小程序 \n");
fprintf(stdout, "由C编写的CGI小程序\n");
return 0;
}
首先要对Apache进行一定的配置,使之支持CGI程序,配置如下:
LoadModule cgi_module modules/mod_cgi.so #注意这项配置是否已经存在,已存在就不要重复配置
AddHandler cgi-script .cgi #设置cgi程序的扩展名,这里.cgi扩展名文件会被当作CGI来执行
#设置cgi-bin的目录权限,假设 /var/www/html 为你的DocumentRoot
AllowOverride None
Options Indexes ExecCGI # ExecCGI 表示该目录允许执行CGI,如果没有加这个权限,即使是.cgi也没有权限执行
Order allow,deny
Allow from all
重启Apache,把上面的C编写的CGI小程序用gcc编译成可执行文件cgi.out,并放到你配置的CGI目录,这里为 /var/www/html/cgi-bin
[root@localhost c]# gcc cgi.c -o test.cgi
[root@localhost c]# mv test.cgi /var/www/html/cgi/
然后浏览器访问该文件 ,就可以看到输出结果了
从以上可以看出,cgi编程和普通的编程并没有太大的区别,cgi小程序也是可以直接运行的可执行文件,并且大多数编程语言都可以进行cgi编程,这或许也是cgi能够流行起来的原因之一,下面看用 php写一个CGI程序。
cgi.php :
#!/usr/bin/env php
PHP编写的CGI程序演示 ". date("Y-m-d H:i:s") ."