0

我有一个应用程序调用 FCGI 响应器来处理一些任务,我需要查找 FCGI 响应器是否接收并返回相同的请求 ID。

FCGI 响应器是用 Perl 编写的,并使用FCGI 模块

根据FastCGI 规范,我可以通过查找 FastCGI 记录来找到信息。

我发现Net::FastCGI库可能适合解决这个问题,但我不确定如何使用该库。

如果我的 fcgi 脚本如下所示,如何使用 Net::FastCGI 转储 FastCGI 记录的内容?

use FCGI;

my $count = 0;
my $request = FCGI::Request();

while($request->Accept() >= 0) {
    print("Content-type: text/html\r\n\r\n", ++$count);
}
4

2 回答 2

1

如果要转储 FastCGI 记录,可以使用Net::FastCGI 。Net::FastCGI 非常低级,需要了解 FastCGI协议

下面的代码显示了一个简单的客户端,它连接到作为第一个参数给出的 FastCGI 应用程序,并输出应用程序发送的记录的字符串表示形式。

#!/usr/bin/perl

use strict;
use warnings;

use IO::Socket             qw[];
use Net::FastCGI::Constant qw[:type :role];
use Net::FastCGI::IO       qw[read_record write_record write_stream];
use Net::FastCGI::Protocol qw[build_params dump_record build_begin_request_body];

use warnings FATAL => 'Net::FastCGI::IO';
use constant TRUE  => !!1;

my $command = shift @ARGV;

my $socket = IO::Socket::INET->new(Proto => 'tcp', Listen => 5)
  or die qq/Could not create a listener socket: '$!'/;

my $host = $socket->sockhost;
my $port = $socket->sockport;

defined(my $pid = fork())
  or die qq/Could not fork(): '$!'/;

if (!$pid) {
    close STDIN;

    open(STDIN, '+>&', $socket)
      or die qq/Could not dup socket to STDIN: '$!'/;

    exec { $command } $command 
      or die qq/Could not exec '$command': '$!'/;
}

close $socket;
$socket = IO::Socket::INET->new(Proto => 'tcp', PeerHost => $host, PeerPort => $port)
  or die qq/Could not connect to '$host:$port': '$@'/;

write_record($socket, FCGI_BEGIN_REQUEST, 1, build_begin_request_body(FCGI_RESPONDER, 0));
write_stream($socket, FCGI_PARAMS, 1, build_params({}), TRUE);
write_stream($socket, FCGI_STDIN, 1, '', TRUE);
while () {
    my ($type, $request_id, $content) = read_record($socket)
      or exit;
    warn dump_record($type, $request_id, $content), "\n";
    last if $type == FCGI_END_REQUEST;
}

示例输出:

fcgi-echo.pl是您在问题中提供的示例应用程序,并且fcgi-dump.pl是上面的代码。

$ perl fcgi-dump.pl ./fcgi-echo.pl 
{FCGI_STDOUT, 1, "Content-type: text/html\r\n\r\n1"}
{FCGI_STDOUT, 1, ""}
{FCGI_END_REQUEST, 1, {0, FCGI_REQUEST_COMPLETE}}
于 2013-09-29T18:35:25.117 回答
0

你不会的。当您已经在使用 FCGI 时,使用 Net::FastCGI 没有任何意义。请求 ID,如果需要,$request->{id}在调用后可用$request->Accept。不过,尚不清楚“接收并返回相同的请求 ID”是什么意思。

于 2013-09-11T02:00:35.763 回答