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

10

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


1
如何确定脚本是从命令行调用还是作为CGI脚本调用? 在Perl中,如何区分CLI和CGI模式? - daxim
可能是如何在Perl中区分CLI和CGI模式的重复问题。 - Ωmega
4个回答

16
最好的选择是检查GATEWAY_INTERFACE环境变量。它将包含服务器使用的CGI协议版本,几乎总是CGI/1.1。Tony Miller提到的HTTP_HOST变量(或任何HTTP_*变量)仅在客户端提供时设置。虽然不太可能,但客户端有时会省略Host标头,导致HTTP_HOST未设置。
#!/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'};

6

您最好在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";

你可以跳过引号:my $is_cgi = defined $ENV{GATEWAY_INTERFACE}; - mike jones
1
这对我起作用了。defined 是在我的环境中有效的,我正在使用 Perl 5。为此解决方案点赞。 - Vhortex

3

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

#!/usr/bin/perl

use strict;
use warnings;

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

-1

检查你的程序是否连接到TTY:

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

5
-1: 不正确。这将告诉您程序是否在交互式运行,而不是它是否在 CGI 下运行。从 cron 工作或作为 shell 管道的一部分被调用将会给出不正确的结果(它将是非交互式的,但也不是 CGI)。 - Dave Sherohman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接