【问题标题】:How can I tell if a Perl script is executing in CGI context?如何判断 Perl 脚本是否在 CGI 上下文中执行?
【发布时间】:2011-06-18 17:52:23
【问题描述】:

我有一个 Perl 脚本,它将从命令行运行并作为 CGI。从 Perl 脚本中,我如何知道它是如何运行的?

【问题讨论】:

标签: perl cgi


【解决方案1】:

最好的选择是检查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'};

【讨论】:

    【解决方案2】:

    您最好在 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};
    • 这对我有用。定义是对我有用的东西,我正在使用 perl 5。为此解决方案投票
    【解决方案3】:

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

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    our $IS_CGI = exists $ENV{'HTTP_HOST'};
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • -1:不正确。这将告诉您程序是否以交互方式运行,而不是它是否在 CGI 下运行。从 cron 作业或作为 shell 管道的一部分调用会产生不正确的结果(它是非交互式的,但也是非 CGI 的)。
      猜你喜欢
      • 2016-01-11
      • 1970-01-01
      • 2018-02-08
      • 1970-01-01
      • 2012-03-28
      • 1970-01-01
      • 2015-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多