Я добился нескольких частичных успехов, но не могу преодолеть последнее препятствие.
Симптом: в тестовом режиме 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», он отлично выполнит тесты. Эвал, делай, а без настроек все висят на неопределенный срок.
Наиболее показательно, что если я установлю Аргументы = в допустимый файл FCGI (или .pl / .cgi / .pm), то этот единственный скрипт будет работать отлично. Экземпляр perl сохраняется во всех вызовах точно так же, как и должен, и работает с заявленной скоростью. Все вызовы методов FCGI :: Request () или CGI :: Fast-> new возвращают объекты, которые они должны. Все положительно чертовски дорого, но это не правильный конфиг. У меня есть куча файлов CGI, и мне нужно создать отдельную запись сопоставления для каждого файла CGI, чтобы этот уродливый kludge работал.
Я подозреваю, что мне не хватает параметра, который заставляет имя сценария отправляться в качестве аргумента в perl, но я не вижу этот параметр. Спасибо за любую помощь.
Редактировать: мои подозрения неверны. 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.
При использовании явной ссылки на сценарий этот сценарий полностью выполняется. Он поддерживает тот же PID perl, поддерживает его счет и возвращает точные значения. В основном, однако, он может импортировать свои модули.
#!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, который я могу установить, чтобы perl смог найти его модули.