2

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

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

对于非 Web Perl 代码,实现无缝 BETA 测试是完全可行的(详见此处):

  • Perl 程序位于生产根目录 ( /usr/code/scripts) 下的标准位置,生产 perl 模块位于同一根目录 ( /usr/code/lib/perl)
  • BETA 代码具有 100% 相同的代码路径,除了 beta 根 ( /usr/code/beta/)
  • 一个特殊的模块@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 web 服务器),出于政治/组织原因是不可行的,有什么方法可以在 Perl 或 mod_perl 中以某种方式解决这个问题?

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

4

1 回答 1

3

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

于 2010-03-19T03:26:22.877 回答