当前位置:编程问答 > CGI >

Windows2000下实现FastCGI(PERL版)

答案:Windows2000下实现FastCGI(PERL版)

四川 王骜骋 著

什么是CGI?
最早的网页都是静态的,好在有了CGI(通用网关接口)的帮助下,网站个个都变的活灵活现,像目前网站上在用的留言本,论坛,聊天室等东西很多都用CGI来完成的。 CGI只是一种接口,并不是一种编程的语言,但是CGI几乎可以接受所有的编程语言去编写它,比如C/C++、VB、SHELL等等,但是其中最流行的是PERL(骆驼) ,PERL的文字处理功能非常强大,作者开发它的目的最先也是为了处理文字报表等信息,它是一种解释性的语言,操作平台的可移植性、兼容性也很强,比如WINDOWS、*NUX、OS/2、VMS等等 ,使用这种语言编写程序需要在操作系统上安装PERL的解释器,要执行脚本的话,PERL解释器会被调用,然后一行一行的做解析(关于PERL的安装、调试请参考相关网站或书籍,这里不多说)。

什么是FastCGI?
时代在进步,技术在更新!我们的网站越做越大,后台使用的数据库规模也逐渐增加,系统资源和网络开销成为了难题,如果再购买硬件设施(比如专业的应用程序服务器),这会投入一笔不小的资金,但是如果不及时解决,遇到了突法性的网络事件又会经常当机,这会给网站带来巨大的无形损失。PERL虽然说是一种方便、快速的东西,但是遇到今天的大型网络,也有点吃不消了,因为CGI的程序每次执行时都要花费时间去复制一个新的进程,这会占用过多的资源。就因为这样一种叫FastCGI的东西横空出世了,FastCGI是一个内存常驻(long-live)型的CGI,它利用内存高速的原理,在编程中进行循环结构把程序寄放在内存
中,只要启动后,它可以一直执行着,从而大量提高程序的运行速度,和CPU、内存的占用时间,这里大家可以想想内存读取和硬盘读取的速度差异所在。这样而来系统就会更快的返回用户的请求,也就是说可以同时拥有更大的并发能力,接受更多的用户。

如何在WIN2K上进行安装?
以前讨论*NUX上安装FastCGI的文章比较多,我这里就不再介绍了。我们今天来看看怎么在WIN2K上安装它。目前我使用的WIN2K是Server(服务器)版和APACHE WEB SERVER。我们采取一种简便的方式在APACHE上安装FastCGI,这里我们不需要进行编译,直接使用编译好的DLL文件,文件下载的地方请看文章尾部(下载一)。 DOWN下来后,把这个文件复制到x:\Apache\modules(x:代表你安装APACHE的盘符),下一步是配置APACHE的
CONFIG文件以加载FastCGI模块,用文本打开x:\Apache\conf\httpd.conf,在其中加入以下两行:

LoadModule fastcgi_module modules/mod_fastcgi.dll
AddHandler fastcgi-script .fcgi .fpl

以上第一行是说,在APACHE启动的时候自动载入mod_fastcgi.dll模块,第二行是说FastCGI的文件识别名称, 好让系统知道哪些是FastCGI脚本,应该怎么去打开它(这里我们定义了两个文件后缀fcgi和fpl,当然你也可 以自己增加其他后缀)。就这样最简单的APACHE FastCGI配置就已经完成了。

完成您的第一个FastCGI程序!
用PERL写FastCGI是最方便不过了,有的只需要增加(修改)几行代码即可完成。下面我们来完成第一个FastCGI 程序。现在大部分都使用ActivePerl的PERL解释器,如果你还没有,请下载一个吧(下载二),FastCGI在PERL中 的实现我们采用一个名称叫FCGI的软件包(下载三),这个包中提供了一些基本的FastCGI函数,下面来进行安装 这个包,把FCGI.zip解压到任意目录,进入该目录后使用以下命令进行安装:

ppm install FCGI.ppd

如果无以外就说明该软件包已经成功安装在你的系统中,然后该轮到写程序的时候了,我们这里写一个最简单的 计数器程序,程序代码如下:

#!perl

#######################
# FastCGI 计数器演示
# 作者 :王骜骋
#######################

use FCGI; # 使用FCGI模块
my $count = 0; # 初始化变量$count为值0

while (FCGI::accept() >= 0) { # 让程序进入循环状态
# FCGI::accept 是FCGI包中的函数
# 用来接受一个连接,如果连接成功则返回0
print "Content-Type:text/html\n\n";# 申明内容类型为HTML
print "你是第";
print $count++;# 输入计数器的值并增加1
print "位访问者";
}

把以上程序拷贝到一个后缀为fcgi或fpl的文件中,然后在浏览器中执行它即可。这时你按刷新就能看到计数器的值在不断的向上增加,通过这个原理,我们可以做出更多更好的程序,下面我们介绍一下留言本的编写技巧和原理。

FastCGI的编程技巧!
以上的程序只是一个简单的计数器,如果真正投放到应用中,我们也不能只写计数器呀。下面我们来谈谈FastCGI编 些留言本的一些使用技巧,编写留言本不像计数器只增加数字就可以了,留言本有很多字段,最简单的也要包含姓名 和内容,这样一来,访问时候就会带有很多参数值,FastCGI在获取这些参数值的时候和一般的PERL程序不一样,因 为FastCGI程序一直在内存中工作,如果使用一般的参数读取方法,很容易产生混淆,以导致程序无法正常工作。所以 我们使用另外一个模块CGI中的子集Fast(备注:CGI是一个相当出名的模块,其中包含的函数相当丰富,比如上传、获 取表单、浏览器COOKIE值、Server Push等等),下面来看看留言本的编写过程:

#!perl

#######################
# FastCGI 留言本演示
# 文件名称:guest.fcgi
# 作者 :王骜骋
#######################

use CGI::Fast qw(:standard);# 使用CGI模块的FastCGI子集

my $data_file = "data.txt";# 指定数据库文件名称

while (my $cgi = new CGI::Fast) {
print "Content-Type:text/html\n\n";
my ($rw);# 本地变量申明
$rw = $cgi->param("rw");# 读取表单值,判断是读取还是写入
if ($rw eq "r" || $rw eq "") {
print qq~
<form name="" action="guest.fcgi" >
<p>姓名:
<input type="text" name="name">
</p>
<p>留言:
<textarea name="content" wrap="VIRTUAL"></textarea>
</p>
<p>
<input type="submit" value="确定">
<input type="reset" value="清除">
<input type="hidden" name="rw" value="w">
</p>
</form>
~;
my @line = &Read_Data;# 获取数据库
foreach (@line) {# 输出留言内容
my ($name,$content) = split(/&&/,$_);
print qq~
姓名:$name
<br>
内容:$content
<hr>
~;
}
} else {
my $name = $cgi->param("name");
my $content = $cgi->param("content");
local $ok = 1;
if ($name eq "" || $content eq "") {
&Print_Erro("请填写完所有的内容!");
}
if ($ok) {
&Write_Data($name,$content);
&Print_Succ("留言成功!");
}
}
}

sub Read_Data {# 函数功能:读取数据库
open (FILE,$data_file);
my @line = <FILE>
close (FILE);
return @line;
}

sub Write_Data {# 函数功能:写入数据库
my ($name,$content) = @_;
open (FILE,">>$data_file");
print FILE "$name&&$content\n";
close (FILE);
}

sub Print_Succ {# 函数功能:输入成功页面
print qq~@_<a href="java script:history.go(-1);">点击这里查看</a>~;
}

sub Print_Erro {# 函数功能:输入错误页面
$ok = 0;
print qq~@_<a href="java script:history.go(-1);">点击这里返回</a>~;
}

作者结束语:试用了以上的程序有何感想?是不是速度飞快?该文章是作者使用FastCGI后的一些经验和感想,如果文章中出现语法错误或系统错误,请大家不吝赐教

下载一:http://www.fastcgi.com/dist/mod_fastcgi.dll
下载二:http://www.activestate.com/
下载三:http://www.activestate.com/PPMPacka...s-only/FCGI.zip

上一个:perl在win32平台上直接操作打印机
下一个:Python 快速入门(一)

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,