10

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

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

我们调查了使用鼠标作为 Moose 的功能受限的替代品,但事实证明(如本答案中所述)这不是一个可行的选择。我们编写的任何与 Moose 一起使用的库都无法以微妙但重要的方式与 Mouse 一起使用。而且我们真的不想分叉我们所有的模块,这样我们就可以同时支持持久环境中的 Moose 和用于“香草”CGI 的鼠标。

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

  1. 酌情分叉我们的内部模块以与 Moose 或 Mouse 一起使用。(呸!)
  2. 只为 FCGI/Moose 开发我们的模块。不再支持“香草”CGI。如果我们必须编写不持久的脚本,他们将无法利用我们的内部模块。
  3. 不要使用 Moose 或 Mouse,而是使用其他一些对象框架。

哪个选项最好?我们现在倾向于 2,如果我们必须让某些东西像普通 CGI 一样运行,我们只会把它吸干。其他框架呢?还有什么更轻量级的我们应该关注的吗?

4

6 回答 6

10

我的偏好是放弃香草 CGI 支持。现在 FCGI 托管真的很便宜,没有理由迎合普通 CGI (IMO),因为它只是强化了 Perl 速度慢的观点。但是如果你不能避免它,那么你可以使用Object::Tiny之类的东西。但是,如果您需要 Moose 提供的角色、约束、元编程和所有其他可爱的东西,那么除非您放弃香草 CGI,否则您将不走运。

于 2009-09-11T14:21:50.087 回答
8

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

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

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

另一方面,拥有一个非 cgi 后端服务器可能会带来真正的好处,该后端服务器可以根据需要连接任何抽象接口。

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

最适合您的情况实际上取决于您的具体情况。根据情况的详细信息,我可以看到自己决定使用这种方法或您上面概述的任何方法。

于 2009-09-11T15:19:30.463 回答
5

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

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

于 2009-09-11T15:27:43.220 回答
1

还有另一种选择 - PPerl

我从未使用过它,但它绝对看起来很有趣。以及编写它的人(Matt Sergeant aka baud)——它实际上为您提供了高质量代码的保证。

于 2009-09-11T14:07:45.303 回答
1

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

于 2009-09-11T19:31:19.847 回答
1

,以及其他一些可能的基本思想是App::Persistent,将 Perl 程序编译为字节码的过程只完成一次,然后在调用时使用某种缓存。由于据说 Moose 有相当大的编译时间损失,我会先尝试这种方法。pperlSpeedyCGI

我在 2001 年左右成功地用于在一个古老的系统上pperl绘制大量MRTG图。Perl 程序对每个图都执行了相当大的开销——这可能与您的 CGI 场景相当。

于 2009-09-11T20:10:10.657 回答