【问题标题】:Perl CGI vs FastCGIPerl CGI 与 FastCGI
【发布时间】:2013-12-21 00:50:57
【问题描述】:

我已经使用 Perl 编程很长时间了,我一直使用 CGI 技术来构建我的应用程序。现在我想重建它们并在 FCGI 上编写新的。请用 f.e. 解释 unsing FastCGI 和 PSGI 之间的区别。斯塔曼。我还想解释一下今天“流行”的 Perl 框架(使用 FCGI)是什么?我知道我可以使用 CGI::Fast 强制我的 CGI 脚本像 FCGI 脚本一样工作。有没有其他模块可以做到这一点?

谢谢!

【问题讨论】:

  • Catalyst 透明地支持 FastCGI。

标签: perl cgi fastcgi psgi


【解决方案1】:

您从错误的角度看待这个问题。不要考虑如何部署程序。相反,将您的程序写入PSGI 接口。然后您就可以在任何环境中部署您的应用程序 - CGI、FastCGI、mod_perl 等,而无需进行任何更改。

您可以使用Plack::RequestPlack::Response 之类的模块编写“原始”PGSI,但建议您使用DancerCatalyst 之类的框架。

如果您有想要在 PSGI 环境中运行的现有 CGI 程序,请参阅Plack::App::WrapCGI

【讨论】:

  • 我认为还有一点需要考虑。也就是说,在 CGI 中运行意味着为每个请求重新加载您的应用程序。而在 FastCGI 和 PSGI 中,您的应用程序仅启动一次并响应来自持久状态的请求。因此,CGI 应用程序经过优化以避免不必要的代码,而 FCGI 或 PSGI 应用程序将针对持久性进行优化,并在启动时完成大量工作。
  • “而在 FastCGI 和 PSGI 中,您的应用程序只启动一次”。当然,FastCGI 也是如此。但对于 PSGI,这取决于应用程序的部署方式。我有部署在 CGI 框架中的 PSGI 应用程序。这是次优的,但它有效。这就是 PSGI 的意义所在——它无处不在 :)
【解决方案2】:

了解 CGI 是 how an information server passes data to a separate program 的标准定义很重要。

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

该界面自 1993 年以来一直被万维网使用。这 规范定义了称为“CGI/1.1”的接口,以及它的使用
在 Unix(R) 和 AmigaDOS(tm) 系统上。

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

CGI 的主要缺点一直是每次调用都需要启动外部程序。在 Unix 上,这需要 Web 服务器在内存中创建自身的副本(fork),然后将外部程序覆盖在副本上(exec)。 fork/exec 循环的计算成本很高,尤其是当您谈论一个覆盖有 Perl 解释器的大型 Apache 进程(多 MB 内存占用)时,该解释器需要在运行之前解析 Perl 程序。

为了从等式中删除 fork/exec 循环,开发了一些新东西。 Mod_perl 将 Perl 解释器嵌入到 apache 进程中,无需在每次调用时 fork/exec,还允许缓存已解析的 perl 程序。各种组织报告的数据表明,吞吐量的增长比 CGI 高出 20 到 100 倍。

大约在同一时间还开发了第二种方法,称为 FastCGI。在 FastCGI 中,外部程序(通常是容器,或应用服务器)在启动 http 服务器的同时启动,http 服务器将请求代理到 FastCGI 进程。此模型提供与删除 fork/exec 循环相同的好处,并且具有一组不同于 mod_perl 的优点/缺点。

最后,CGI/FastCGI/mod_perl,无论您选择哪个,您的程序都必须了解如何获取 Web 服务器传递给它的数据,这就是问题的症结所在,几乎所有后 CGI 技术定义了它自己的向/从程序传递数据的方式(PSGI 中的 GI 仍然是网关接口),但提供了一个适配器来将其首选方式转换为 CGI 模型,以帮助更容易采用。

我不确定我是否已经回答了您的问题,但感谢您的提问。我喜欢写这个答案;-)

【讨论】:

    猜你喜欢
    • 2014-10-03
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 2011-03-14
    • 2010-11-10
    • 1970-01-01
    • 2015-08-09
    • 2010-11-07
    相关资源
    最近更新 更多