我有一段代码
my $fcgi_request = FCGI::Request(\*STDIN,\*STDOUT,\*STDERR, \%ENV,0,FCGI::FAIL_ACCEPT_ON_INTR);
while (1) {
my $cgi = new CGI('');
}
那么FCGI :: Request的作用是什么以及它与CGI的不同之处是因为新的CGI()也给了我请求句柄。
答案 0 :(得分:1)
免责声明:这主要是猜测。
实施该代码的人可能尝试将现有的CGI应用程序迁移到FCGI以使其更快。如果查看FCGI文档,您会看到几乎所有传递给FCGI::Request
的参数都是默认值。唯一不是默认的是(缩进我的,实际上是in the code it's different)。
标志(默认值:0)
可能的值:
的 FCGI :: FAIL_ACCEPT_ON_INTR 强>
如果设置,如果中断,Accept将失败。它 没有设定,它会继续等待。
因为这些参数是位置的,所以代码的作者很可能认为传递所有默认值是一个好主意,所以不要改变任何东西。这是有道理的,但看起来很奇怪。
然后是程序接受请求的循环。在里面,有旧的CGI程序。这个程序可能会使用CGI的其他功能,如HTML生成(现在不鼓励),所以作者可能会把它留在里面。由于CGI如何工作(它读取环境变量)和FCGI的工作方式(也读取环境变量),不相互排斥。
现在,如果在程序中的某个位置显示print $q->header('text/html')
之类的内容,则会转到STDOUT
,上面的内容被设置为FCGI请求使用的文件句柄。所以FCGI处理程序将看到输出,一切都很好。
现在有趣的是为什么有while (1)
而不是while (my $fcgi_request->Accept() >= 0 )
。它表示Accept
接受连接并附加句柄。这应该在你的代码中的某个地方。
答案 1 :(得分:1)
CGI是一种协议,用于使用环境变量和STDIN的组合将HTTP请求传递给进程,并使用STDOUT接收响应。因此,请求只能发送给专门为处理该请求而创建的子项。
为每个请求启动子进程可能很慢,特别是如果程序需要在执行之前编译。快速CGI是解决这个问题的方法。
快速CGI是一种使用套接字将HTTP请求传递给进程的协议。因此,请求可以发送到预先存在的进程,并且此进程可以处理多个请求。
FCGI :: Request接受快速CGI请求,并使其看起来像CGI请求,允许使用CGI.pm。这允许使用熟悉的库,并且它允许CGI程序更容易地转换为快速CGI程序。
在该特定片段中,FCGI :: Request实际上并未使用,因为$request->Accept()
未被调用。如上所述,它需要CGI请求,而不是快速CGI请求。