我必须维护一个包含大量 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归因
不隶属于 StackOverflow
scroll top