몇 가지 부분 성공을 달성했지만 마지막 장애물을 넘을 수는 없습니다.IIS 6에서 FastCGI를 구성하여 Perl 모듈을 올바르게로드하는 방법
증상 : 테스트 모드에서 FastCGI가 완벽하게 수행됩니다. 평범한 perl 스크립트를 eval 또는 do 모드로 실행할 때 완벽하게 수행됩니다. FCGI :: Request() 객체 또는 CGI :: Fast-> new 객체에 액세스하려고하면 무한정 중단됩니다. 내 설정은 다음과 같습니다.
[Types]
fcgi=FCGI
cgi=FCGI
pl=FCGI
pm=FCGI
[FCGI]
ExePath=C:\perl\bin\perl.exe
;ExePath=C:\strawberry\perl\bin\perl.exe
Arguments="-MFCGI::IIS=eval"
;Arguments=d:\inetpub\cgi-bin\hello.fcgi
;Arguments=d:\inetpub\cgi-bin\h2.fcgi
ActivityTimeout=5
QueueLength=999
MaxInstances=20
InstanceMaxRequests=500
위에서 언급 한 것을 참조 할 수 있습니다. ActiveState 또는 Strawberry를 사용하면 동일한 동작이 발생합니다. -MFCGI :: IIS 인수를 "test"와 동일하게 설정하면 테스트가 완벽하게 실행됩니다. Eval, do 및 no 설정은 모두 무기한 중지됩니다.
가장 중요한 것은 말하자면, 인수를 유효한 FCGI 파일 (또는 .pl/.cgi/.pm)로 설정하면 해당 단일 스크립트가 완벽하게 실행됩니다. perl 인스턴스는 필요한만큼 정확하게 호출 할 수 있으며 광고 된 속도로 실행됩니다. FCGI :: Request() 또는 CGI :: Fast-> new 메서드에 대한 호출은 모두 필요한 객체를 반환합니다. 모든 것이 긍정적으로 늠름한 dory이지만 올바른 설정이 아닙니다. 나는 cgi 파일의 뗏목을 가지고있다. 그리고 나는 그 cgi 파일을위한 별개의 매핑 엔트리를 만들어야 만 그 추악한 kludge 작업을 할 수있다.
필자는 스크립트의 이름을 perl의 인수로 보내지 만, param을 볼 수없는 설정이 누락 된 것으로 의심됩니다. 어떤 도움을 주셔서 감사합니다.
편집 : 내 의심이 잘못되었습니다. FCGI는 정확한 스크립트를 분명히 부르고 있지만 잘못된 환경에서 어떻게 든 호출합니다. -MFCGI :: IIS 인수를 사용하면 명시 적 경로 인수를 사용하는 것과 똑같은 스크립트를 호출하지만 명시 적 경로 인수를 사용하면 스크립트에서 해당 라이브러리를 찾을 수 있습니다. 내 도전 과제는 스크립트가 라이브러리를 올바르게 식별하도록하는 것입니다.
-MFCGI를 사용 :이 스크립트가 실패 IIS :
#!c:/perl/bin/perl
use CGI::Fast;
오류 :
Error!
Can't locate object method "FILENO" via package "FCGI::Stream" at
C:/Perl/lib/CGI.pm line 822.
Compilation failed in require at C:/Perl/lib/CGI/Fast.pm line 20.
BEGIN failed--compilation aborted at C:/Perl/lib/CGI/Fast.pm line 20.
Compilation failed in require at (eval 4) line 4.
BEGIN failed--compilation aborted at (eval 4) line 4.
명시 적 스크립트 참조를 사용하여,이 스크립트는 완전히 성공합니다. 동일한 perl PID를 유지하고 카운트를 유지하며 정확한 값을 반환합니다. 대부분, 모듈을 가져올 수 있습니다.
#!c:/perl/bin/perl -w
use strict;
use CGI::Fast;
my $count = 1;
while (my $q = CGI::Fast->new)
{
print("Content-Type: text/plain\n\n");
print("Process ID: $$; Count is: " . ++$count);
}
일부 모듈이있을 수 있도록 설정할 수있는 ENV var가 있어야합니다.