2016-12-19 12 views
3

CGIFCGIを使用してURLパラメータを取得しようとしています。FCGIでPOSTパラメータを受け入れる

ブラウザでスクリプトを実行すると、最初のリクエストのパラメータしか取得できませんが、リクエスト$countは増分します。

use CGI; 
use FCGI; 

my $fcgiRequest = FCGI::Request(); 
while ($fcgiRequest->Accept() >= 0) 
{ 
    print("Content-type: text/html\r\n\r\n", ++$count); 
    my $q = new CGI; 
    print "name = " . $q->param("name") ; 
    print "\n"; 
} 

答えて

4

あなたはこのように一緒にCGI.pmFCGI.pmを使用することはできません。その間にいくつかのグルーコードが必要です。CGIは環境から情報を読み込む必要があり、呼び出す方法ではできません。

Perlには、これに対応するモジュールCGI::Fastが含まれています。 CGIFCGIの代わりにCGI::Fastを使用してコードを少し変更してください。

use strict; 
use warnings; 
use CGI::Fast; 

my $count; 
while (my $q = CGI::Fast->new) { 
    # $q is a fresh CGI object for the current request 

    print("Content-type: text/html\r\n\r\n", ++$count); 
    print "name = " . $q->param("name") ; 
    print "\n"; 
} 

CGIスクリプトを既にお持ちの場合は、そのスクリプトを関数に入れて、そのループ内で呼び出すことができます。

CGI :: Fastの仕組みに興味がある場合は、take a look at its source code on CPANまでお気軽にお問い合わせください。主なことは、環境とファイルハンドル(STDOUTとSTDERR)は新しい要求ごとにマッピングする必要がありますが、実装では常に最初のものを解析する必要があります。

私がリンクしているperldocとCPANの両方の例は、古くて現代的なPerlコードではないことに注意してください。


今日それが現在のPerlのリリースから削除されたとして、あなたは、任意のよりprobably not use CGIでしょう。代わりに、実装方法についてはthe PSGI interface specificationPlackをご覧ください。良いことは、さまざまなデプロイメントテクノロジ(CGIやFast CGIなど)にわたって明確なインターフェイスを提供することです。プログラムをApacheやnginxを使った単純なCGI、またはApacheやその他のWebサーバーを使った永続的なFCGIプロセスとして、あるいはPerlで書かれた特定の目的に合わせて作られたさまざまなPlack Webサーバーを通じてスタンドアロンアプリケーションとして実行できます。

+0

再「* CGIは、環境からのものを読むために必要があるため*」、はい、しかし、FCGIが設定した環境適切な。それは問題ではありません。 – ikegami

2

要求に対してCGI.pmオブジェクトが作成されると、そこに再利用されます。

あなたはループの最後に以下を追加することにより、CGI.pmをリセットすることができます。

CGI::_reset_globals(); 
関連する問題