cgi和FCGI之间的区别:: perl中的请求

时间:2016-06-20 13:19:39

标签: perl cgi

我有一段代码

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()也给了我请求句柄。

2 个答案:

答案 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请求。