由於似乎mod_perl只管理Perl interpreters per VHOST,是 有什麼辦法可以影響哪個克隆解釋器mod_perl 選擇處理請求?我已閱讀了可配置的 示波器,並查看了源中的「modperl_interp_select」,並且我可以看到,如果請求已經有關聯的解釋器,那麼之一由mod_perl選擇。如何使mod_perl解釋器按照一些約定粘滯?
else if (r) {
if (is_subrequest && (scope == MP_INTERP_SCOPE_REQUEST)) {
[...]
}
else {
p = r->pool;
get_interp(p);
}
我想補充某種處理程序的mod_perl選擇一個 解釋器來處理請求,然後選擇傳譯員 它分配給請求自己之前的基礎上,包括在 要求不同的標準。
但是我很難理解這樣的處理程序是否可以存在於 全部或者是否有關於請求的所有內容都已經被 所選的解釋器mod_perl處理。
此外,我可以看到APR ::游泳池的API,但它似乎並沒有提供 設置當前池對象, 是「get_interp」在讀什麼mod_perl的一些用戶數據的能力。
任何人都可以幫助我嗎?謝謝!
的背景了一下:我在的cgi-bin目錄一個結構如下所示:
cgi-bin
software1
customer1
*.cgi
*.pm
customer2
*.cgi
*.pm
software2
customer1
*.cgi
*.pm
customer2
*.cgi
*.pm
每個客戶使用該軟件的私有副本和軟件是使用本身,例如customer1的software1可以通過將一些特殊的software2客戶庫加載到它自己的Perl解釋器中來與customer1的software2交談。爲了使事情更加複雜,軟件2甚至可以通過使用svn:external將自己的私有安裝帶入軟件1的通用/通用部分。所以我在一個VHOST中有許多相同的軟件和相同的Perl軟件包,我不能保證所有這些私人安裝都具有相同的版本級別。
這是一個相當混亂,但已知在我們在相同的Perl解釋器內有規則工作。
但是現在出現mod_perl,根據需要克隆解釋器,並將它們重用到請求的任意子目錄中,在這種情況下,事情將會中斷,因爲解釋器突然已經處理了customer1的software1,現在應該處理software2的customer2,它使用通用的軟件包1,已經由Perl解釋器加載之前,因爲使用%INC而不是軟件的私有包2等等,所以使用它們...
是的,有不同的交易方式就像VHOST和子域persoftware或客戶或其他,但我想檢查保持一個VHOST和當前目錄結構的不同方式,只需使用mod_perl或Apache httpd提供的內容即可。有一種方法是,如果我能告訴mod_perl始終對同一個目錄的請求使用相同的Perl解釋器。這樣mod_perl會創建它的解釋器池,我將負責爲每個目錄選擇它們中的每一個。
您有具體的理由使用mod_perl嗎?使用Plack你可以獲得更多的控制權(AFAIK)。 (也許我錯過了一些關鍵點)... – jm666
PLACK對我們來說是全新的,你如何使用PLACK實現我的請求?我希望它像在mod_perl中一樣運行在httpd中,而不是獨立運行,但是需要控制哪個Perl解釋器被各種原因用於具有普通的舊CGI腳本的服務目錄。最後一件事很重要,解釋器不能被重用於不同的腳本/目錄。 –
也許我誤解了你的需求,但是我會爲某些URL(每個你的CGI腳本都有自己的URL)設置apache(或任何httpd這樣的nginx)作爲「反向代理」,並且將爲每個腳本運行一個基於Plack的服務器(在不同的端口上)使用[CGI :: Emulate :: PSGI](https://metacpan.org/pod/CGI::Emulate::PSGI)或[CGI :: PSGI](https://metacpan.org/ POD/CGI :: PSGI)。因此,簡而言之,每個CGI腳本將在完全隔離的(但是httpd代理的)環境中在其自己的端口上運行一個獨立的Plack(perl)服務器。 – jm666