gpt4 book ai didi

multithreading - 旧版 Perl 代码和 Apache2

转载 作者:行者123 更新时间:2023-12-04 04:26:56 26 4
gpt4 key购买 nike

我必须维护一个包含大量 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 修复问题的正确方法,但以下解决方法有效:
  • 禁用 mod_perl
  • 启用 mod_cgi
  • AddHandler cgi脚本.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)进行请求交互等。

    关于multithreading - 旧版 Perl 代码和 Apache2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24018293/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com