【问题标题】:Accept POST parameters with FCGI使用 FCGI 接受 POST 参数
【发布时间】:2017-05-04 13:33:29
【问题描述】:

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

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

【问题讨论】:

    标签: perl cgi fastcgi


    【解决方案1】:

    你不能像这样一起使用CGI.pmFCGI.pm。你需要一些胶水代码,因为 CGI 需要从环境中读取内容,而它不能以你调用它的方式。

    Perl 中包含一个模块CGI::Fast 可以为您执行此操作。不要使用CGIFCGI,您只需使用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 specificationPlack 以了解如何实现它。这样做的好处是它提供了跨不同部署技术(例如 CGI 和 Fast CGI)的清晰界面。你可以让你的程序作为一个简单的 CGI 与 Apache 或 nginx 一起运行,或者作为一个持久的 FCGI 进程与 Apache 或其他网络服务器一起运行,或者通过各种 Plack 网络服务器作为一个独立的应用程序运行,这些网络服务器是用 Perl 编写的并为特定目的量身定制的。

    【讨论】:

    • Re "因为 CGI 需要从环境中读取东西",是的,但是 FCGI 设置了适当的环境。这不是问题。
    【解决方案2】:

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

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

    CGI::_reset_globals();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-18
      • 2022-01-13
      • 1970-01-01
      • 2016-01-23
      • 2016-08-31
      • 2021-07-15
      相关资源
      最近更新 更多