Как я могу определить, выполняется ли скрипт Perl в контексте CGI? - PullRequest
8 голосов
/ 31 января 2011

У меня есть Perl-скрипт, который будет запускаться из командной строки и как CGI. Как из скрипта Perl узнать, как он запускается?

Ответы [ 5 ]

15 голосов
/ 31 января 2011

Лучший выбор - проверить переменную окружения GATEWAY_INTERFACE. Он будет содержать версию протокола CGI, используемого сервером, это почти всегда CGI/1.1. Переменная 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'};
4 голосов
/ 31 января 2011

Лучше всего проверить GI в CGI.

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";
3 голосов
/ 31 января 2011

Одним из возможных способов является проверка переменных среды, которые устанавливаются веб-серверами.

#!/usr/bin/perl

use strict;
use warnings;

our $IS_CGI = exists $ENV{'HTTP_HOST'};
1 голос
/ 19 апреля 2011

Вы можете пропустить кавычки:

my $ is_cgi = определен $ ENV {GATEWAY_INTERFACE};

0 голосов
/ 31 января 2011

Проверьте, подключена ли ваша программа к TTY или нет:

my $where = -t() ? 'command line' : 'web server';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...