工人MPM下mod_perl中的进程内协调?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (70)

我需要在mod_perl中做一些简单的时区计算。DateTime不是一个选项。我需要做的是通过设置$ ENV {TZ}并使用localtime和POSIX :: mktime轻松完成,但在线程MPM下,我需要确保一次只有一个线程与环境混淆。(我不关心本地时间的其他用途等)

如何使用互斥锁或其他锁定策略来序列化(在非编组意义上)对环境的访问?我看过的文档并不能很好地解释如何为这个用途创建一个互斥锁。也许有些东西,我只是没有了解你如何创建互斥体。

更新:是的,我知道需要使用Env :: C来设置TZ。

提问于
用户回答回答于

由于这个问题,mod_perl 2实际上与mod_perl 1不同地处理%ENV哈希。在mod_perl中,1%ENV直接绑定到环境结构,因此更改%ENV会改变环境。在mod_perl 2中,%ENV哈希是从environ填充的,但不会传回更改。

这意味着你不能再使用$ ENV {TZ}来调整时区 - 特别是在线程环境中。该Apache2的:: LOCALTIME模块将使其成为非螺旋的情况下工作(通过使用信封:: C),但在一个线程化的MPM,这将是坏消息中运行时。

关于此问题,mod_perl源(src / modules / perl / modperl_env.c)中有一些注释:

/* * XXX: what we do here might change:
 *      - make it optional for %ENV to be tied to r->subprocess_env
 *      - make it possible to modify environ
 *      - we could allow modification of environ if mpm isn't threaded
 *      - we could allow modification of environ if variable isn't a CGI
 *        variable (still could cause problems)
 */
/*
 * problems we are trying to solve:
 *      - environ is shared between threads
 *          + Perl does not serialize access to environ
 *          + even if it did, CGI variables cannot be shared between threads!
 * problems we create by trying to solve above problems:
 *      - a forked process will not inherit the current %ENV
 *      - C libraries might rely on environ, e.g. DBD::Oracle
 */
用户回答回答于

如果您使用的是apache 1.3,那么您不需要使用互斥锁。Apache 1.3产生了许多工作进程,每个工作程序执行一个线程。在这种情况下,您可以写:

{
    local $ENV{TZ} = whatever_I_need_it_to_be();

    # Do calculations here.
}

更改变量local意味着它将恢复为块末尾的先前值,但仍会传递到从该块中进行的任何子例程调用。这几乎可以肯定你想要的。由于每个进程都有自己独立的环境,因此您不会使用此技术更改其他进程的环境。

对于apache 2,我不知道它在分叉和线程方面使用的是什么型号。如果它保持相同的方法分离进程并且每个都有一个单独的线程,那么你没问题。

如果apache 2使用诚实的真实线程,那么这不在我的详细知识领域,但我希望另一个可爱的stackoverflow人员可以提供帮助。

一切都是最好的,

Paul

所属标签

可能回答问题的人

  • 腾讯云数据库 TencentDB

    腾讯云 · 产品团队 (已认证)

    303 粉丝2 提问51 回答
  • EatRice

    17 粉丝0 提问183 回答
  • 华讯云

    1 粉丝0 提问156 回答
  • 网站运维工程师

    H3C · 软件开发工程师 (已认证)

    5 粉丝0 提问18 回答

扫码关注云+社区

领取腾讯云代金券