我已经在 Perl 上编程很长时间了,我一直使用 CGI 技术来构建我的应用程序。现在我想重建它们并在 FCGI 上编写新的。请用 fe Starman 解释 unsing FastCGI 和 PSGI 之间的区别。我还想解释一下今天“流行”的 Perl 框架(使用 FCGI)是什么?我知道我可以使用 CGI::Fast 强制我的 CGI 脚本像 FCGI 脚本一样工作。有没有其他模块可以做到这一点?
谢谢!
你从错误的角度看待这个问题。不要考虑如何部署程序。相反,将您的程序写入PSGI接口。然后您将能够在任何环境中部署您的应用程序 - CGI、FastCGI、mod_perl 等,而无需进行任何更改。
您可以使用诸如Plack::Request和Plack::Response之类的模块编写“原始”PGSI ,但最好建议您使用诸如Dancer或Catalyst之类的框架。
如果您有想要在 PSGI 环境中运行的现有 CGI 程序,请参阅Plack::App::WrapCGI。
重要的是要理解 CGI 是信息服务器如何将数据传递到单独程序的标准定义。
通用网关接口 (CGI) 是一个简单的接口,用于在信息服务器下以独立于平台的方式运行外部程序、软件或网关。目前支持的
信息服务器是HTTP服务器。该接口自 1993 年以来一直被万维网使用。该规范定义了称为“CGI/1.1”的接口,以及它
在 Unix(R) 和 AmigaDOS(tm) 系统上的使用。
在标准模型中,Web 服务器在每次需要时启动外部程序,将数据编组为标准格式并将其传递给程序[作为环境的一部分,或通过外部程序的标准输入,具体取决于使用的 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 模型,以帮助更容易采用。
我不确定我是否已经回答了你的问题,但谢谢你的提问。我喜欢写这个答案;-)