2011-01-31 18 views
8

Tengo un script Perl que se ejecutará desde la línea de comandos y como CGI. Desde dentro del script de Perl, ¿cómo puedo saber cómo se está ejecutando?¿Cómo puedo saber si un script Perl se está ejecutando en contexto 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

Respuesta

15

La mejor opción es comprobar la variable GATEWAY_INTERFACE medio ambiente. Contendrá la versión del protocolo CGI que usa el servidor, casi siempre es CGI/1.1. La variable HTTP_HOST mencionada por Tony Miller (o cualquier variable HTTP_*) solo se establece si el cliente la proporciona. Es raro pero no imposible para un cliente omitir el encabezado Host dejando HTTP_HOST unset.

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

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

Si estoy esperando que se ejecute en mod_perl en algún momento también a comprobar la variable de entorno MOD_PERL también, ya que se establece cuando el guión se compila por primera vez.

#!/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

Una posible forma es verificar las variables de entorno establecidas por los servidores web.

#!/usr/bin/perl 

use strict; 
use warnings; 

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

ver si su programa se conecta a un TTY o no:

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

-1: Incorrecto. Esto le dirá si el programa se está ejecutando de forma interactiva, no si se está ejecutando bajo CGI. Ser llamado desde un trabajo cron o como parte de una canalización de shell daría resultados incorrectos (no sería interactivo, sino también no CGI). –

4

comprobaría mejor la GI en el 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

Puede omitir las comillas:

mi is_cgi $ = $ ENV {definido GATEWAY_INTERFACE};

+0

Por cierto, creo que sería bueno si el módulo CGI tuviera una forma de acceder a las variables de entorno. por ejemplo: my $ q = new CGI; mi is_cgi = $ q-> gatewayInterface(); # NO FUNCIONA. SÓLO UNA SUGERENCIA. –

Cuestiones relacionadas