【问题标题】:How can I beta test web Perl modules under Apache/mod_perl on production web server?如何在生产 Web 服务器上测试 Apache/mod_perl 下的 Web Perl 模块?
【发布时间】:2010-03-19 11:26:22
【问题描述】:

我们有一个设置,其中大多数代码在升级到全面生产之前以 BETA 模式部署 - 这意味着它在完整的生产环境中运行(使用生产数据库 - 通常是生产数据;和生产 Web 服务器)。我们称该阶段为 BETA 测试。

主要要求之一是 BETA 代码升级到生产必须是从 beta 到生产目录的简单“cp”命令 - 没有代码/文件名更改。

对于非 Web Perl 代码,实现无缝 BETA 测试是完全可行的 (see details here):

  • Perl 程序位于生产根目录 (/usr/code/scripts) 下的标准位置,生产 perl 模块位于同一根目录 (/usr/code/lib/perl) 下
  • BETA 代码具有 100% 相同的代码路径,但在 beta 根 (/usr/code/beta/) 下除外
  • 一个特殊的模块会根据脚本是从/usr/code/scripts 还是/usr/code/test/scripts 调用来操作任何脚本的@INC,以包含用于测试脚本的测试库。

在我们需要对 Web Perl 代码进行 beta 测试之前,此设置工作正常(设置为 EmbPerl 和 Apache/mod_perl)。

挂起如下:如果生产 Perl 模块和 BETA Perl 模块具有相同的名称(例如 /usr/code/lib/perl/MyLib1.pm 和 /usr/code/beta/lib/perl/MyLib1.pm),那么 mod_perl 将只能加载其中一个模块到内存中 - 由于并发问题,我们无法知道特定网页会影响当前加载的模块版本。

撇开明显的非编程解决方案(获得一个血腥的 BETA Web 服务器),由于政治/组织原因是不可行的,我们有什么办法可以在 Perl 或 mod_perl 中解决这个问题?

我尝试了各种卸载 %INC 列出的 Perl 模块的方法,但问题仍然是另一个用户可能会在正确(或相当错误)的时刻加载 beta 页面并加载 beta 模块,这将用于我的生产页面。

【问题讨论】:

    标签: perl apache testing mod-perl perl-module


    【解决方案1】:

    使用 mod_perl 2.0,您可以使用 PerlOptions +Parent 为每个虚拟主机创建单独的 Perl 解释器池。当然,这会花费你额外的内存,但它会起作用。

    【讨论】:

    • 太棒了!不要认为 Powers That Be 会同意在生产 Web 服务器上运行虚拟主机,但值得一试……我仍然喜欢一个不涉及虚拟主机的解决方案,很可能他们会说“不” .
    • 该链接使用“PerlSwitches -Mlib=path”并注释:“META:-Mlib 是否可移植?(Darwin/5.6.0 上的 -Mlib 有问题?)”。不就是说“PerlSwitches -Ipath”吗?
    猜你喜欢
    • 2012-10-28
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 2016-08-12
    • 2014-12-21
    相关资源
    最近更新 更多