Вы не можете использовать CGI.pm и FCGI.pm вместе, как это. Вам нужен некоторый код-клей, потому что CGI должен читать материал из среды, и он не может в том, как вы его вызываете.
Существует модуль CGI::Fast, входящий в комплект поставки Perl, который делает это за вас. Вместо использования CGI и FCGI вы просто используете 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 больше, так как он был удален из текущего Perl релизов. Вместо этого вы можете посмотреть the PSGI interface specification и Plack о том, как его реализовать. Хорошо, что он обеспечивает четкий интерфейс для разных технологий развертывания (таких как CGI и Fast CGI). Вы можете просто запустить свою программу как простой CGI с Apache или nginx или как постоянный процесс FCGI с Apache или другими веб-серверами или как отдельное приложение через различные веб-серверы Plack, написанные на Perl и предназначенные для определенных целей.
Ре «*, потому что CGI нужно читать материал из окружающей среды *», Да, но FCGI настраивает окружающую среду подходящее. Это не проблема. – ikegami