簡體   English   中英

舊版Perl代碼和Apache2

[英]Legacy Perl Code and Apache2

我必須維護一個包含大量Perl代碼的史前網站。 搬到新服務器后,事情變得模糊:

當來自同一客戶端的多個請求在頁面上運行(使用GD生成圖像)時,這些腳本會覆蓋其他變量,從而導致奇怪的結果。

作為一個快速的解決方法,我在Apache中設置MaxRequestsPerChild = 1,修復了這個問題,但現在事情變得緩慢到了爬行......

有沒有辦法分開請求? 任何可以幫助我的mod_perl或Apache參數?

阿帕奇:

Server version: Apache/2.2.15 (Unix)
Server built:   Apr  3 2014 23:56:16
Server's Module Magic Number: 20051115:25
Server loaded:  APR 1.3.9, APR-Util 1.3.9
Compiled using: APR 1.3.9, APR-Util 1.3.9
Architecture:   64-bit
Server MPM:     Prefork
  threaded:     no
    forked:     yes (variable process count)

perl -v

This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi

任何解決方案都將非常感謝:)


編輯:我找不到使用mod_perl修復問題的正確方法,但以下解決方法有效:

  • 禁用mod_perl
  • 啟用mod_cgi
  • AddHandler cgi-script .pl
  • 禁用suEXEC

最后一個是必要的,因為當啟用suEXEC時,它給了我“腳本頭的過早結束”。

不,你無法做到“分開請求”。 在單個Perl解釋器進程中運行的所有腳本將共享相同的環境,並且在mod_perl下該環境是持久的。 您可以嘗試設置ModPerl::Registry來運行它們(如果您還沒有),它們應該將它們包裝在它們自己的子例程中並消除一些命名空間問題,但是如果腳本沒有記住持久性( *)你仍然需要至少在某種程度上修改它們。

http://perl.apache.org/docs/2.0/user/intro/start_fast.html#Registry_Scripts

當腳本使用特定模塊(例如SOAP :: Lite)時,您也會遇到麻煩,這些模塊具有在使用它的所有模塊之間共享的全局狀態,盡管這是一個非常罕見的問題。

所以不,不幸的是,你無法做任何事情來確保腳本在不改變它們的情況下正常工作。 有些可能沒問題,有些則不會。 除了單獨的mod_perl服務器之外,您應該設置一個常規的Apache CGI服務器並逐步遷移它們。 您不會在常規CGI服務器上獲得性能,但您也不會遇到問題。

(*)特別是,這是來自很多很多月前的內存,它們必須避免設置全局變量,總是用my聲明變量,使用CGI模塊(或mod_perl API)進行請求交互等等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM