使用FCGI接受POST参数

时间:2016-12-19 13:24:44

标签: perl cgi fastcgi

我正在尝试使用CGIFCGI获取网址参数。

在我的浏览器上执行脚本时,我只获取第一个请求的参数,但请求$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";
}

2 个答案:

答案 0 :(得分:4)

您不能像这样一起使用CGI.pmFCGI.pm。你需要一些胶水代码,因为CGI需要从环境中读取东西,而且它不能像你调用它那样。

Perl中包含一个模块CGI::Fast,可以为您执行此操作。您只需使用CGI并更改一些代码,而不是使用FCGICGI::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 specificationPlack如何实现它。这样做的好处是它提供了跨不同部署技术(例如CGI和Fast CGI)的清晰界面。您可以让您的程序作为Apache或nginx的简单CGI运行,或作为Apache或其他Web服务器的持久FCGI流程运行,或通过Perl编写的各种Plack Web服务器作为独立应用程序运行,并针对特定用途进行定制。 / p>

答案 1 :(得分:2)

一旦为请求创建了一个CGI.pm对象,它就会在那里重复使用。

您可以通过在循环结尾添加以下内容来重置CGI.pm:

CGI::_reset_globals();