2011-01-31 10 views
8

Mam skrypt Perl, które będą uruchamiane z linii poleceń i jak CGI. Z poziomu skryptu Perla dowiesz się, jak można go uruchomić?Jak mogę sprawdzić, czy skrypt Perl wykonuje się w kontekście CGI?

+0

http://stackoverflow.com/questions/1914966/how-can-i-determine-if-a-script-was-called-from-the-command-line-or-as-a-cgi-scri http://stackoverflow.com/questions/3086655/in-perl-how-to-distiniguish-between-cli-cgi-mode – daxim

Odpowiedz

15

Najlepszym wyborem jest sprawdzenie zmiennej środowiskowej GATEWAY_INTERFACE. Będzie zawierał wersję protokołu CGI używanego przez serwer, prawie zawsze jest to CGI/1.1. HTTP_HOST zmienna wspomniano przez Tony Miller (lub dowolnej zmiennej HTTP_*) ustawiona jest tylko wtedy, gdy klient dostarcza je. Rzadko, ale nie jest niemożliwe, aby klient pominął nagłówek Host, pozostawiając brak ustawienia HTTP_HOST.

#!/usr/bin/perl 
use strict; 
use warnings; 

use constant IS_CGI => exists $ENV{'GATEWAY_INTERFACE'}; 

Jeśli mam spodziewa się uruchomić pod mod_perla w pewnym momencie będę również sprawdzić zmienną środowiskową z MOD_PERL również, ponieważ zostanie on ustawiony, gdy skrypt jest najpierw kompilowany.

#!/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'}; 
3

Jednym z możliwych sposobów jest sprawdzenie zmiennych środowiskowych, które są określone przez serwery WWW.

#!/usr/bin/perl 

use strict; 
use warnings; 

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

Sprawdź, czy program jest podłączony do TTY lub nie:

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

1: Nieprawidłowe. Dzięki temu dowiesz się, czy program działa interaktywnie, a nie czy działa pod CGI. Wywołanie z zadania cron lub jako część potoki powłoki dałoby nieprawidłowe wyniki (byłoby to nieinteraktywne, ale także nie-CGI). –

4

Można by najlepiej sprawdzić GI w 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"; 
1

Można pominąć cytaty:

moja $ is_cgi = zdefiniowany $ ENV {GATEWAY_INTERFACE};

+0

Nawiasem mówiąc, myślę, że byłoby miło, gdyby moduł CGI miał sposób na dostęp do zmiennych środowiskowych. np: moja $ q = new CGI; my is_cgi = $ q-> gatewayInterface(); # NIE DZIAŁA. TYLKO SUGESTIA. –

Powiązane problemy