Perl如何检测是从命令行运行还是从浏览器调用

时间:2014-08-01 01:26:36

标签: perl

是否有一种很好的方法可以检测Perl脚本是从终端/ DOS调用还是从Web服务器调用。

我目前有这段代码:

sub cli {
    # return 1 if called from browser, 0 if called from command line
    if  (defined $ENV{GATEWAY_INTERFACE} ||  exists $ENV{HTTP_HOST}){
        return 0;
    }
    return 1;
}

但请注意,所有服务器都没有设置这些ENV变量。

如果脚本从终端I运行的原因是打印文本/普通格式的消息,如果从浏览器运行,我将打印HTML格式的消息。

2 个答案:

答案 0 :(得分:4)

我通常会这样做:

if (-t STDIN) {
    //This is running from a terminal
}

阅读评论后进行修改:我发现了另一个问题,详细说明了另一种解决方案:How do I check if a Perl script is running in a terminal?

答案 1 :(得分:2)

以下是一个快速示例,可能不是最准确的,但用于演示您可以检查进程的父命令。

my $parent_process  = `ps -o ppid= -p $$ | xargs ps -o command= -p`;
if ($parent_process =~ /httpd/) {
   say q{CGI};
} else {
   say q{Terminal};
}

基本上,我们检索当前进程的搜索,并将父进程管道到另一个查找中,以便我们可以获取运行的父进程。从终端它应该是shell名称(例如,-bash),但如果它由服务器运行,它应该是服务器守护程序httpd(取决于Web服务器)。

让服务器设置环境变量并检查该变量是否存在会容易得多。这一切都取决于您运行命令的位置以及您正在运行命令的人。

这可以进一步浓缩为:

my $is_server = `ps -o ppid= -p $$ | xargs ps -o command= -p | grep httpd -q && echo "1" || echo "0"`; chomp $is_server;
if ($is_server) { ... } else { ... }