2011-01-31 24 views
8

Tôi có một tập lệnh Perl sẽ được chạy từ dòng lệnh và dưới dạng CGI. Từ bên trong kịch bản Perl, làm sao tôi có thể biết nó đang chạy như thế nào?Làm cách nào tôi có thể biết liệu một tập lệnh Perl có đang thực thi trong ngữ cảnh CGI không?

+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

Trả lời

15

Lựa chọn tốt nhất là kiểm tra biến môi trường . Nó sẽ chứa phiên bản của giao thức CGI mà máy chủ đang sử dụng, điều này hầu như luôn luôn là CGI/1.1. Biến số HTTP_HOST được đề cập bởi Tony Miller (hoặc bất kỳ biến số HTTP_*) nào chỉ được đặt nếu khách hàng cung cấp. Rất hiếm khi khách hàng không thể bỏ qua tiêu đề Host để lại HTTP_HOST không được đặt.

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

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

Nếu tôi mong đợi để chạy theo mod_perl tại một số điểm tôi cũng sẽ kiểm tra xem biến môi trường MOD_PERL cũng có, vì nó sẽ được thiết lập khi kịch bản được biên dịch đầu tiên.

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

Một cách có thể là kiểm tra các biến môi trường do máy chủ web đặt.

#!/usr/bin/perl 

use strict; 
use warnings; 

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

Xem nếu chương trình của bạn được kết nối với một TTY hay không:

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

-1: Không đúng. Điều này sẽ cho bạn biết liệu chương trình có đang chạy tương tác hay không, cho dù chương trình có chạy dưới CGI hay không. Được gọi từ một công việc cron hoặc là một phần của một đường ống vỏ sẽ cho kết quả không chính xác (nó sẽ không tương tác, nhưng cũng không phải CGI). –

4

Bạn sẽ kiểm tra tốt nhất GI trong 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

Bạn có thể bỏ qua các dấu ngoặc kép:

$ tôi is_cgi = định nghĩa $ ENV {GATEWAY_INTERFACE};

+0

Nhân tiện, tôi nghĩ sẽ tốt hơn nếu mô-đun CGI có cách truy cập các biến môi trường. ví dụ: my $ q = new CGI; is_cgi của tôi = $ q-> gatewayInterface(); # KHÔNG HOẠT ĐỘNG. CHỈ LÀ MỘT GỢI Ý. –

Các vấn đề liên quan