Perl CGI与FastCGI的区别

4
我已经长时间使用Perl进行编程,一直使用CGI技术构建我的应用程序。现在我考虑重建这些应用程序并在FCGI上编写新的应用程序。请解释FastCGI和PSGI之间的区别,例如Starman。另外,请解释今天流行的基于FCGI的Perl框架是什么?我了解到可以使用CGI::Fast将我的CGI脚本强制转换为FCGI脚本。是否还有其他模块可以实现这一点?
谢谢!

Catalyst可以无缝支持FastCGI。 - ikegami
2个回答

8
重要的是要理解CGI是一个标准定义,信息服务器如何将数据传递给独立程序

通用网关接口(CGI)是一种简单的接口,用于在信息服务器下以平台无关的方式运行外部程序、软件或网关。目前,支持的信息服务器是HTTP服务器。

该接口自1993年以来一直被万维网使用。本规范定义了所谓的“CGI/1.1”接口及其在Unix(R)和AmigaDOS(tm)系统上的使用。

在标准模型中,Web服务器每次需要一个外部程序时都会启动它,将数据编组成标准格式并将其传递给程序(可以作为环境的一部分或通过外部程序的标准输入,具体取决于使用的HTTP方法(GET、POST等)。程序处理数据,通过将标题和内容打印到标准输出返回其数据,然后退出。

CGI的主要缺点一直是在每次调用时启动外部程序的费用。在Unix上,这需要Web服务器在内存中创建自身的副本(fork),然后将外部程序覆盖到该副本上(exec)。fork/exec周期在计算上很昂贵,特别是当你谈论一个大型Apache进程(多MB内存占用)与一个需要解析Perl程序才能运行的Perl解释器叠加在一起时。
为了从方程式中去除fork/exec周期,开发了一些新方法。Mod_perl将Perl解释器嵌入到apache进程中,消除了每次调用时fork/exec的需要,并允许对解析的perl程序进行缓存。各种组织报告的数字显示,吞吐量增加了20至100倍以上。
第二种方法称为FastCGI,也是在同一时间开发的。在FastCGI中,同时启动http服务器和外部程序(通常是容器或应用服务器),并将http服务器代理请求到FastCGI进程。这种模型提供了去除fork/exec周期的相同好处,并具有与mod_perl不同的一系列优缺点。
最终,无论选择CGI/FastCGI/mod_perl中的哪一个,您的程序都必须了解如何获取Web服务器传递给它的数据,这是关键问题,几乎每种CGI技术都定义了自己的传递数据到/从程序的方式(PSGI中的GI仍然代表网关接口),但提供了适配器来将其首选方式转换为CGI模型,以帮助更容易地采用。我不确定自己是否完全回答了您的问题,但感谢您的提问。我很喜欢编写这个答案;-)

6
你的角度有误。不要考虑如何部署程序,而是将你的程序编写为PSGI接口。这样,你就可以在任何环境下部署应用程序——CGI、FastCGI、mod_perl等等,而无需更改任何内容。
你可以使用Plack::RequestPlack::Response等模块编写“原始”PGSI,但最好使用像DancerCatalyst这样的框架。
如果你有现有的CGI程序想要在PSGI环境中运行,请参阅Plack::App::WrapCGI

1
我认为还有一些需要考虑的因素。特别是在 CGI 中运行意味着每个请求都要重新加载您的应用程序,而在 FastCGI 和 PSGI 中,您的应用程序仅启动一次,并从持久状态响应请求。因此,CGI 应用程序被优化以避免不必要的代码,而 FCGI 或 PSGI 应用程序将被优化以实现持久性并在启动时执行大量工作。 - schultzter
在FastCGI和PSGI中,您的应用程序仅启动一次。当然,对于FastCGI是正确的。但对于PSGI而言,它取决于应用程序的部署方式。我有一些在CGI框架中部署的PSGI应用程序。虽然不太理想,但它可以工作。这就是PSGI的优点 - 它可以在任何地方工作 :) - Dave Cross

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接