如何在生产Web服务器上的Apache / mod_perl下测试Web Perl模块?

时间:2010-03-19 03:01:40

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

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

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

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

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

这个设置工作正常,直到我们需要对我们的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网络服务器),由于政治/组织原因这是不可行的,我们有什么方法可以在Perl或mod_perl中解决这个问题吗?

我使用了各种方法来卸载%INC已列出的Perl模块,但问题仍然是另一个用户可能会在恰当(或相当错误)的时刻加载测试页并加载测试版模块这将用于我的制作页面。

1 个答案:

答案 0 :(得分:3)

使用mod_perl 2.0,您可以使用PerlOptions +Parent为每个vhost创建一个单独的Perl解释器池。当然,它会花费你额外的记忆,但它会起作用。