perl - 使用 FCGI 接受 POST 参数

标签 perl cgi fastcgi

我正在尝试使用 CGI 获取 URL 参数和 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";
}

最佳答案

您不能使用 CGI.pmFCGI.pm像这样在一起。您需要一些介于两者之间的胶水代码,因为 CGI 需要从环境中读取内容,而它不能以您调用它的方式进行。

有一个模块CGI::Fast包含在 Perl 中,它会为你做这件事。而不是使用 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)的清晰接口(interface)。您可以让您的程序作为一个简单的 CGI 与 Apache 或 nginx 一起运行,或者作为一个持久的 FCGI 进程与 Apache 或其他网络服务器一起运行,或者作为一个独立的应用程序通过各种用 Perl 编写并为特定目的定制的 Plack 网络服务器运行。

关于perl - 使用 FCGI 接受 POST 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41223608/

相关文章:

nginx - fastcgi 多路复用?

c - Nginx + FastCGI + C 抛出 502 Bad Gateway

java - Delphi 中有哈希数组吗?

perl - 我可以使用什么模块来解析 Perl CGI 脚本中的 RSS 提要?

perl - perl 作为一种语言和 CGI​​ 脚本有什么区别?

php - CentOS 服务器安全

perl - 我可以在 Perl 的反引号中执行多行命令吗?

json - 在 Perl 中对哈希数组进行编码

perl - 如何用perl中的新行替换^M

apache - 在 apache 中将 REMOTE_ADDR 设置为 X-Forwarded-For