2016-12-19 6 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)을 각각의 새 요청에 매핑해야하며 구현시 CGI가 항상 첫 번째 구문을 구문 분석해야한다는 것입니다.

필자가 링크 한 perldoc과 CPAN의 예제는 구식이며 최신 Perl 코드를 나타내지 않습니다. 이 릴리스 현재 펄에서 제거 된 것처럼


오늘, 당신은 더 이상 probably not use CGI 것입니다. 대신 구현 방법에 대해서는 the PSGI interface specificationPlack을 살펴볼 수 있습니다. 좋은 점은 다른 배포 기술 (예 : CGI 및 빠른 CGI)에서 명확한 인터페이스를 제공한다는 것입니다. 프로그램을 Apache 또는 nginx가있는 간단한 CGI로 실행하거나 Apache 또는 기타 웹 서버를 사용하여 영구적 인 FCGI 프로세스로 실행하거나 Perl로 작성되고 특정 목적에 맞게 조정 된 다양한 Plac 웹 서버를 통해 독립 실행 형 응용 프로그램으로 실행할 수 있습니다.

+0

재를 "* CGI *이 환경에서 물건을 읽을 필요가 있기 때문에"예,하지만 FCGI는 환경을 설정합니다 적당한. 그건 문제가 아니야. – ikegami

2

CGI.pm 개체가 요청에 대해 만들어지면 그 요청이 다시 사용됩니다.

당신은 루프의 끝에 다음과 같은 추가 CGI.pm을 재설정 할 수 있습니다

CGI::_reset_globals();