我必须维护一个包含大量Perl代码的史前网站。搬到新服务器后,事情变得模糊:
当来自同一客户端的多个请求在页面上运行(使用GD生成图像)时,这些脚本会覆盖其他每个变量,从而导致奇怪的结果。
作为一种快速的解决方法,我在Apache中设置了MaxRequestsPerChild = 1,修复了这个问题,但现在事情变得缓慢了......
有没有办法分开请求?任何可以帮助我的mod_perl或Apache参数?
的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修复问题的正确方法,但以下解决方法有效:
最后一个是必要的,因为它让我过早地结束了脚本标题'当suEXEC启用时。
答案 0 :(得分:0)
不,你无法做到“分开请求”。在单个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)进行请求交互等等。