取势 明道 优术

作者为 扶 凯 发表

前几个文章讲了几次都是怎么转换现有的基于 CGI 的应用到 PSGI 和告诉你怎么运行它们.现在要告诉你终极方法来在 PSGI 的应用中运行 CGI 的程序.并且大部分时候不用修改任何 CGI 的内容.
 
在CGI.pm 的子类中有一个 CGI::PSGI 的子类.使用它可以只要几行,就能让你轻易的转换 CGI.pm 的应用到 PSGI 的环境.但是对于一个非常混乱的或老的 CGI 程序仅仅打印输出到标准输出,那我们就不容易解决它?

CGI::Emulate::PSGI 是一个可以运行任何基于 CGI 程序的模块.不管多老的程序,多乱程序,是打印内容到 STDOUT, 还是直接直接从 ENV 中来读 HTTP 头部的变量,这些都能运行.因为这个 CGI::Emulate::PSGI 都会仿真这个环境.这个原始的 CGI::Emulate::PSGI 的 POD 是如下的例子

use CGI::Emulate::PSGI;
CGI::Emulate::PSGI->handler(sub {
    do "/path/to/foo.cgi";
    CGI::initialize_globals() if &CGI::initialize_globals;
});

它能运行存在的 CGI 的程序,可能都不需要使用 CGI.pm 的模块(CGI.pm 会缓存很多的环境变量,所以需要 initialize_globals() 这个函数来清除).

 

前几天我坐旧金山到伦敦的航班,去参加伦敦的 Perl Workshop,一些聪明的黑客提了个好意见,即给任何 CGI 脚本编译成一个子程序.我给这模块被命名为 CGI::Compile,它最好的结合 CGI::Emulate::PSGI一起使用.

my $sub = CGI::Compile->compile("/path/to/script.cgi");
my $app = CGI::Emulate::PSGI->handler($sub);

我有一堆 CGI 脚本怎么办,Plack 应用中 Plack::App::CGIBin 也能使现有的 CGI 程序运行在 PSGI 应用,假设你有一堆的 CGI 脚本在 /path/to/cgi-bin 目录中,你只要这样运行就行了:

$ plackup -MPlack::App::CGIBin -e 'Plack::App::CGIBin->new(root => "/path/to/cgi-bin"))'

你只要 mount 你的路径到这个地址 .假如你有 foo.pl 的文件在这个目录中,你直接打开 http://localhost:5000/foo.pl 来运行这个 CGI 的应用就行了,这样就很象这个脚本运行在 Apache 的 mod_perl Registry 的机器上一样.

 

这是我的译文,原文:http://advent.plackperl.org/2009/12/day-9-running-cgi-scripts-on-plack.html

来了就留个评论吧! 1个评论