2016-12-19 18 views
3

Я пытаюсь получить параметры URL, используя CGI и FCGI.Принимать параметры POST с помощью FCGI

При выполнении сценария в моем браузере я получаю только параметры моего первого запроса, но запрос $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.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 и предназначенные для определенных целей.

+0

Ре «*, потому что CGI нужно читать материал из окружающей среды *», Да, но FCGI настраивает окружающую среду подходящее. Это не проблема. – ikegami

2

Как только объект CGI.pm создается для запроса, он снова используется.

Вы можете сбросить CGI.pm, добавив следующую строку в конце цикла:

CGI::_reset_globals();