从1997年接触CGI以后,我就发现我渐渐的喜欢上了它,当时我国还是HTML 的时代,好的动态网站不多。其中由网易开发的163电子邮局,更让我喜欢CGI。在当时 CGI 这个名词在中国的网络上出现的频率少之又少,ASP刚刚浮出水面,更听不到 PHP 这个现在无人不晓的程序语言。就在今年,PHP好像一夜间就侵袭整个地球。在中国的网站到处可以见到以.PHP结尾的URL,PHP的贴子,PHP的文章和程序代码。而你几个月前,还看到某个网站在招聘CGI/PERL程序员的时候,今天却换成了PHP。一时间我的大脑膨胀的不得了,我不知道我是否应该放弃CGI/PERL,去学习PHP。我在论坛做了很久的CGI/Perl版主,起初当时还没有听说PHP这个脚本语言,几个月后出现了PHP版,它以迅雷不及掩耳之势迅速追赶一切的一切,几乎成了当时的焦点。而批评、蔑视和诋毁CGI/Perl文章的也逐渐多了起来。写了3年的CGI/Perl程序,今天突然被称为速度慢、耗费系统资源和语言复杂等种种原因好像变成了程序中的垃圾。因此,我在此的犹豫不决,让我更多的了解了CGI、ASP、API和PHP这四种WEB上最常见的语言。
在CGI中,有众多语言,包括:C/++、Perl、TCL、Basic等。其中由于Perl的易编译调试、移植性颇强。几乎成了CGI的标准,或代言词。每每当人们提到CGI的时候,你必然会想到PERL。前些月人们还在CGI与ASP之间的争执,但实事证明了ASP并不是最好的网络语言,它的安全性令人担忧,它的移植性更令人头疼。面对着抄得沸沸扬扬免费的Linux,你只能感到无奈,只好掏出腰包给微软来换取新的Windows。PHP和 ASP 一样都是被称为“可嵌入式”的程序脚本语言和强大的数据处理能力。并大大贬低了CGI/PERL在此的用处。在一篇介绍 PHP 的文章中这样说:“用Perl/C等写的CGI脚本是一种“非嵌入式”的服务器端脚本,因为它是一个单独的程序,
而不是嵌在HTML文档中再通过另一个程序解释替换。例如,下面的Perl程序:
print "Content-type:text/htmlnn";
print <
HeadofHTML
print " aaa";
print "";
在这个脚本中,它的确是非嵌入式的,但是我们要了解到是,早在公元1996年8月份,可嵌入是的CGI脚本程序已经开发成功,它就是ePerl。因为它并不是CGI/Perl的主要功能,只有国外一些网站在使用,在国内很少会知道。它 PHP一样有着可嵌入是的功能。一个普通Perl的例子:
print "foon";
print "barn";
print “HELLO WORLD”;
print "baz n";
print "quuxn";
采用ePerl 以后:
foo
bar
< ? print “HELLO WORLD”; !>
baz
quux
而PHP:
foo
bar
<? echo “HELLO WORLD”; !>
baz
quux
从上面三个里之中,我们可以看出,Perl和 PHP一样都具有嵌入的功能,当然你非要说 echo 比 print 少一个字母我也没有办法:)另一个是embPerl,embPerl在和 ePerl很多方面都很相像。它们的主要不同在于ePerl不是HTML专用的,而embPerl是专门用于HTML的。EmbPerl提供了一些元命令来完成特殊任务,像填充 HTML表等等。用了特殊的方法解释一些HTML标记。但是学习新的语法比较费劲,不过ePerl它和Perl没有什么区别,如果需要用于一般目的的嵌入Perl 方案,ePerl更佳。而EmbPerl在特殊的时候更为出色。在使用eperl和EmbPerl前必须安装它们的模块。这里介绍ePerl在Unix类型系统中的安装方法:
首先到:www.engelschall.com/sw/eperl/ 下载相应的ePerl模块,在eperl源目录下面依次输入:perl Makefile.pl、make、make test、make install。在以SSI形式使用ePerl的时候,这些命令将安装在Apache::Perl 模块。修改httpd.conf文件 ,
Location /eperl/>
SetHandler perl-script
PerlHandler Apache::ePerl
CGI/Perl的最大致命弱点,即人们说所的速度和系统资源。的确,它在这个方面有很大不足。我们知道一般 CGI/Perl 每一次启动都要启动一个进程,如果有2万人同时在一个聊天室里聊天,那么就会产生2万个进程,在强大的中央处理和在大的内存都很难处理如此之多的进程。但是每一种东西,总是会有最终的解决方案,要不然微软的HOTMAIL为何至今还用CGI呢?Fast-CGI ,是把原来的CGI 进行优化,即原来2万的用户聊天的时候,只启动一个进程,这样大大节省了系统资源。比如普通的脚本:
Print “Content-type : text/htmlnn”;
Print “I Love Perl”;
这样的程序,每一次都要启动一个进程。
而使用了FCGI模块以后:
use FCGI;
while(FCGI::accept() >=0 )
{
print "Content-type: text/htmlnn";
print "I Love Perl”;
}
exit 0;
这样每次之需要启动一个CGI进程,大大缓解了过渡占用系统资源的问题。
从CGI转化到FCGI,并不难,只要了解它的基本结构。
如上面的两个例子,只要把Print “Content-type : text/htmlnn”;
Print “I Love Perl”;这两句,套入响应循环代码中就可以了。当然前提是你要安装了FCGI这个模块,否则就会出现错误。在UNIX类型系统(包括: Linux/FreeBSD/SunOs),你可以这样:下载,到www.cpan.org下载FCGI模块,然后tar zvxf filename.tar.gz,完成后出现以该文件名命名的目录,进入目录后,依次输入 perl Makefile.pl、make、make test,然后开始安装 make install。怎样就完成了。
在Windows中,我用的是Perl 5.2,本来是Perl 5.6,可是怎么也没有安装上去,我的朋友也是如此。到http://www.activestate.com/ppmpackages/5.005/zips下载 FCGI模块后,解压缩。启动MS-DOS窗口。提示符下面输入 ppm,然后出现PPM>,输入 install /path/to/filename。就大功告成了。
CGI的另一个好处是加密性强,大家都知道C/C++编译出来最终运行的程序是二进制的,你无从猜想它的源代码。而Perl是解析性语言,我想大多数程序员有和我同样的想法,如何把Perl加密从而保护我们的知识结晶。当时最为风行的是Perl2Exe,很多人用了它,把自己的Perl加密,当你得意洋洋的说你的程序是用C编写的时候,Exe2Perl的反编译程序已经出世了。然而很多人没有意识到Perl 从自始至终都提供一个perlcc的程序,可以将目前的Perl 源代码转化成C源代码并编译,方法很简单 在CMD模式下面输入perlcc filename.pl即可!在不同的操作系统上可以编译出不同的兼容操作系统的二进制可执行的CGI。这个时候你就可以骄傲的说,你的程序使用C编写的了。在这一点,目前任何程序语言都无法与其比美(据我所知Java可以被反编译出原始代码)。如果你想把你的商用程序出售,而又不愿意出售源代码,你最好的选择就是CGI了。
我一直在寻求一个科学的文章,来审视众多语言中那个是最好的。我想有很多人都是这样。比尔盖茨至今可能还认为世界上最好的语言是 Basic。本我主要地目的是,让更多的人真正知道 CGI 与其它程序的分别,好与弊。每种程序语言都有它的好的一面和坏的一面。我们不应该去偏袒某一方,或诋毁某一方。让CGI的程序员们不会被老板骂。当你用FCGI写出来的程序,将会比你以前的程序快得多。我目前正致力于把我十几个的商用程序进行FCGI的优化,效果的确不错。当你学习过CGI ASP 和PHP之后,你会感觉到CGI更加适合于大型程序的编写。曾经有人这么评论:
小型站台 php (比如GuestBook)
中型大型用 perl+fastcgi(比如 Webmail Business)
巨型用 C/C++语言……