驼鹿 是一个很棒的对象框架。问题在于,连同它的依赖项一起,它是 非常 大的。我们的分析表明,在我们的平台上,仅加载 Moose 就会在非持久性 CGI 应用程序脚本上产生 5-6 秒的开销。对于这些一次性应用程序来说,这是不可接受的。

相比之下,当我们使用持久进程系统(例如 FCGI)时,这种启动开销就被消除了(或者更确切地说,只发生一次),一切都很好。我们面临的问题是,我们无法保证所有代码始终在持久进程下运行。

我们调查使用 老鼠 作为 Moose 的功能有限的替代品,但事实证明(如 这个答案)这不是一个可行的选择。我们编写的与 Moose 一起使用的任何库都无法以微妙但重要的方式与 Mouse 一起使用。和我们 真的 不想分叉我们所有的模块,以便我们可以在持久环境中支持 Moose,并在“普通”CGI 中支持 Mouse。

鉴于此,我们有以下选择:

  1. 分叉我们的内部模块 根据需要使用 Moose 或 Mouse。(哎呀!)
  2. 只为 FCGI/Moose 开发我们的模块. 。不再支持“普通”CGI。如果我们必须编写非持久性的脚本,他们将无法利用我们的内部模块。
  3. 不要使用 Moose 或 Mouse, ,但还有一些其他对象框架。

哪个选项最好?我们现在倾向于 2,如果我们必须让某些东西作为普通 CGI 运行,我们就会接受它。其他框架怎么样?我们应该考虑一些更轻量级的东西吗?

有帮助吗?

解决方案

我倾向于放弃vanilla CGI支持。 FCGI托管这些天真的很便宜,没有理由迎合香草CGI(IMO),因为它只是强化了Perl缓慢的观点。但如果你无法避免它,那么你可以使用 Object :: Tiny 。但是如果你需要角色,约束,元编程以及穆斯提供的所有其他可爱,除非你放弃香草CGI,否则你运气不好。

其他提示

您可以使用Moose编写后端服务器应用程序,然后编写非常小的简单CGI脚本来查询后端。

+-------+    +--------------+
| Small |===>|  Persistent  |
|  CGI  |<===| Moose Server |
+-------+  ^  +--------------+
           |
         Socket
       Connection

这或多或少是FCGI所做的,所以使用FCGI可能更有意义。

另一方面,拥有一个非cgi后端服务器可能会有实际的好处,可以根据需要使用任何抽象接口。

例如,如果您使用TCP(或UDP)套接字,那么您可以让本机桌面应用程序与CGI相同的后端。

在你的情况下最合适的是什么取决于你的具体情况。根据情况的细节,我可以看到自己决定使用这种方法或您在上面概述的任何方法。

我的建议是选择#2,然后帮助我们重构Moose,以便CGI变得可行。 fREW目前正在开发Moose测试套件,以便启用MooseX :: Antlers项目,该项目应该减少大部分开销,这意味着Moose无法用于CGI环境。

Matt Trout(mst),目前落后于MooseX :: Antlers的人,表示希望能够在CGI环境中运行应用程序,如果有必要的话。我建议现在坚持使用FCGI并且纠缠他,你可以做些什么来帮忙!

Jonathan Rockway写了关于 APP :: Peristent 的文章(奇怪的是,几个月前,不在CPAN)。我没有使用它,但基于他上面链接的博客文章,它看起来提供了一个相当透明的服务器 - 客户端架构,你可以包装你的CGI的实际处理。

基本思想 App::Persistent, pperl, SpeedyCGI 可能还有一些问题是,将 Perl 程序编译为字节代码的过程只完成一次,之后的调用会使用某种缓存。由于 Moose 据说有相当大的编译时惩罚,所以我会首先尝试这种方法。

我已经成功使用了 pperl 用于绘制大量 MRTG 2001 年左右的一个古​​代系统的图表。Perl 程序针对每个图形执行,这是相当大的开销——这可能与您的 CGI 场景相当。

还有另一种选择 - PPerl

我从未使用它,但它看起来确实很有趣。写它的人(Matt Sergeant又名波特) - 它几乎可以保证你提供高质量的代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top