2011-01-31 7 views
8

私はコマンドラインからCGIとして実行されるPerlスクリプトを持っています。 Perlスクリプトの中から、どのように実行されているかをどのように伝えることができますか?Perlスクリプトが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

答えて

15

GATEWAY_INTERFACE環境変数を確認することをお勧めします。これは、サーバーが使用しているCGIプロトコルのバージョンを含みます。これは、ほとんどの場合、CGI/1.1です。 Tony Miller(または変数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'}; 
3

可能な方法の1つは、Webサーバーによって設定された環境変数を確認することです。

#!/usr/bin/perl 

use strict; 
use warnings; 

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

プログラムがTTYに接続されているかどうかを参照してください:

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

-1:正しくありません。これは、プログラムがCGIで動作しているかどうかではなく、インタラクティブに実行されているかどうかを示します。 cronジョブから呼び出されたり、シェルパイプラインの一部として呼び出されたりすると、間違った結果が出ます(非対話型でも非CGIでも可能です)。 –

4

あなたは最高のCGIでGIをチェックします。

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

あなたが引用符をスキップすることができます

私の$ is_cgiを= $ ENV {GATEWAY_INTERFACE}が定義されました。

+0

ちなみに、CGIモジュールが環境変数にアクセスする方法があればいいと思います。例: my $ q =新しいCGI;私のis_cgi = $ q-> gatewayInterface(); # 動作しません。ちょっとした提案。 –

関連する問題