是否有一种很好的方法可以检测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格式的消息。
答案 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 { ... }