如何判断Perl脚本是否在CGI上下文中执行?

时间:2011-01-31 17:25:24

标签: perl cgi

我有一个Perl脚本,它将从命令行和CGI运行。在Perl脚本中,我该如何判断它的运行方式?

5 个答案:

答案 0 :(得分:15)

最好的选择是检查GATEWAY_INTERFACE环境变量。它将包含服务器正在使用的CGI协议的版本,这几乎总是CGI/1.1。 Tony Miller(或任何HTTP_HOST变量)提到的HTTP_*变量仅在客户提供时才设置。客户端很少但不是不可能省略Host标题,而HTTP_HOST未设置。{/ p>

#!/usr/bin/perl
use strict;
use warnings;

use constant IS_CGI => exists $ENV{'GATEWAY_INTERFACE'};

如果我希望在某些时候在mod_perl下运行,我也会检查MOD_PERL环境变量,因为它将在首次编译脚本时设置。

#!/usr/bin/perl
use strict;
use warnings;

use constant IS_MOD_PERL => exists $ENV{'MOD_PERL'};
use constant IS_CGI      => IS_MOD_PERL || exists $ENV{'GATEWAY_INTERFACE'};

答案 1 :(得分:4)

您最好检查CGI中的GI。

use CGI qw( header );

my $is_cgi = defined $ENV{'GATEWAY_INTERFACE'};

print header("text/plain") if $is_cgi;
print "O HAI, ", $is_cgi ? "CGI\n" : "COMMAND LINE\n";

答案 2 :(得分:3)

一种可能的方法是检查由Web服务器设置的环境变量。

#!/usr/bin/perl

use strict;
use warnings;

our $IS_CGI = exists $ENV{'HTTP_HOST'};

答案 3 :(得分:1)

您可以跳过引号:

my $ is_cgi =已定义$ ENV {GATEWAY_INTERFACE};

答案 4 :(得分:-1)

查看您的程序是否已连接到TTY:

my $where = -t() ? 'command line' : 'web server';