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?
Trả lời
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'};
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'};
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';
-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). –
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";
Bạn có thể bỏ qua các dấu ngoặc kép:
$ tôi is_cgi = định nghĩa $ ENV {GATEWAY_INTERFACE};
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 Ý. –
- 1. Làm cách nào để biết tập lệnh Perl của tôi có đang chạy trong Windows không?
- 2. Có cách nào tôi có thể thực thi một tập lệnh PHP từ MySQL không?
- 3. Trong Perl, làm cách nào tôi có thể tắt CGI :: Cá chép được tải trong tập lệnh được yêu cầu?
- 4. Tôi có thể thực thi các tập lệnh ipython không?
- 5. Làm cách nào để chạy tập lệnh CGI perl của tôi mà không cần apache?
- 6. python: làm cách nào để biết liệu tệp có được thực thi khi nhập so với tập lệnh chính không?
- 7. Trong tập lệnh Julia, bạn có thể cho biết tập lệnh đã được nhập hoặc thực thi trực tiếp không?
- 8. Tôi làm cách nào để có được tên người dùng thực thi tập lệnh Perl của mình?
- 9. Có cách nào để biết liệu một tập lệnh php có đang chạy trong chế độ cli không?
- 10. Làm cách nào để tránh zombie trong các tập lệnh Perl CGI chạy dưới Apache 1.3?
- 11. Sử dụng cả ARGV và CGI trong tập lệnh Perl
- 12. Làm thế nào để tập lệnh PHP của tôi có thể biết liệu máy chủ có bận không?
- 13. Làm cách nào để biết liệu ngữ cảnh OpenGL có được tăng tốc phần cứng không?
- 14. Làm cách nào để biết liệu tôi có đang chạy từ JRuby và Ruby không?
- 15. Làm cách nào để chạy tập lệnh Perl từ bên trong tập lệnh Perl?
- 16. Trong Perl, làm cách nào tôi có thể biết chuỗi là một số?
- 17. Làm thế nào tôi có thể nhận Getopt của Perl :: Dài để biết liệu đối số có bị thiếu không?
- 18. Trong Bash, làm thế nào tôi có thể biết liệu mình hiện đang ở một thiết bị đầu cuối
- 19. Làm thế nào tôi có thể gọi một tập lệnh PHP từ Perl?
- 20. Làm cách nào tôi có thể gọi một Proc có một khối trong một ngữ cảnh khác?
- 21. Selenium & Firefox: Làm thế nào tôi có thể tắt cảnh báo "Không phản hồi tập lệnh"?
- 22. Làm thế nào tôi có thể tìm ra tập lệnh PHP nào đang chạy trong Linux?
- 23. Cách xác định tập lệnh nào đang được thực thi trong quy trình PHP-FPM
- 24. SQLDeveloper có hỗ trợ thực thi các tập lệnh không?
- 25. Android: làm cách nào tôi có thể biết liệu bàn phím mềm có đang hiển thị hay không?
- 26. Javascript setTimeout có dừng thực thi tập lệnh khác không
- 27. có/không có tập tin thực thi
- 28. Tôi có thể biết, trong node.js, nếu tập lệnh của tôi đang được chạy trực tiếp hoặc được tải bởi một tập lệnh khác?
- 29. Làm cách nào để tôi có thể đóng gói tập lệnh Perl của mình để chạy trên máy mà không có Perl?
- 30. làm thế nào chúng ta có thể sử dụng một tập tin thực thi trong c + +?
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