2010-03-19 58 views
2

我們有一個設置,在提升到完整生產之前,大多數代碼都是以BETA模式部署的 - 也就是說,它運行在完整的生產環境中(使用生產數據庫 - 通常是生產數據;以及生產Web服務器)。我們稱該階段爲BETA測試。如何在生產Web服務器上的Apache/mod_perl下測試Web Perl模塊?

其中一個主要要求是BETA代碼升級到生產必須是從測試版到生產目錄的簡單「cp」命令 - 無代碼/文件名更改。

對於非web Perl代碼,實現無縫BETA測試是相當可行的(see details here):

  • Perl程序生活在一個標準位置下生產根(/usr/code/scripts)具有相同的根目錄下活生產perl模塊(/usr/code/lib/perl
  • 的BETA碼具有除下的β根100%相同的代碼路徑(/usr/code/beta/
  • 的特殊模塊操縱基於任何腳本的@INC腳本是否從稱爲或/usr/code/test/scripts,以包含beta腳本的beta庫。

這個設置工作正常,直到我們需要測試我們的Web Perl代碼(安裝程序是EmbPerl和Apache/mod_perl)爲止。

掛斷如下:如果兩個生產的Perl模塊和BETA的Perl模塊具有相同的名稱(例如/usr/code/lib/perl/MyLib1.pm/usr/code/beta/lib/perl/MyLib1.pm),然後的mod_perl將僅能夠將這些模塊中的一個加載到內存 - 並且我們沒有辦法知道特定的網頁會由於併發問題而影響當前加載哪個版本的模塊。由於政治/組織方面的原因,拋開顯而易見的非編程解決方案(得到一個血腥的測試版網絡服務器)是不可行的,有什麼辦法可以在Perl或mod_perl中繞過這個問題?

我使用了各種方法卸載%INC已列出的Perl模塊,但問題仍然是,其他用戶可能會在正確的(或錯誤的)時刻加載測試頁,並且已加載beta模塊,這將會是用於我的製作頁面。

回答

3

使用mod_perl 2.0,您可以使用PerlOptions +Parent爲每個虛擬主機創建單獨的Perl解釋器池。當然,這會花費你額外的內存,但它會起作用。

+0

太棒了!不要認爲Powers That Be會同意在生產Web服務器上運行虛擬主機,但值得一試......我仍然喜歡一個不涉及虛擬主機的解決方案,他們會說「不」 。 – DVK 2010-03-19 03:49:11

+0

該鏈接使用「PerlSwitches -Mlib = path」和註釋:「META:is -Mlib是否可移植?(Darwin/5.6.0上的-Mlib有問題?)」。是不是像說「PerlSwitches -Ipath」一樣? – DVK 2010-03-19 03:51:26