在mod_perl环境中使用共享内存

时间:2014-12-02 05:53:44

标签: perl shared-memory mod-perl

我有一个要求,其中

  1. 我必须在内存中放置一个数据结构(Perl哈希),这样每个HTTP进程(运行Perl脚本)都将使用该哈希。

  2. 哈希结构大约为300 MB。

  3. 环境是mod_perl

  4. 我想创建一个在Apache start加载的模块,它在共享区域中创建一个哈希并返回对它的引用。

    您能否对此行为发表评论,或建议其他解决方案。另请指出一些好的资源来检查示例。

2 个答案:

答案 0 :(得分:1)

如果在mod_perl内存上放置大量哈希数据, 然后mod_perl父进程在服务器启动阶段读取它。

首先,在Your/HugeData.pm目录上创建@INC

package Your::HugeData;

our %dictionary = (
    ....
);

接下来,apache进程在启动时读取它。

# In apache.conf (or anywhere apache config file)
PerlModule Your::HugeData

然后您的脚本可以使用%Your::HugeData::dictionary作为包变量。

# In mod_perl handler script or ModPerl::Registry (CGI emulate) script.
use Your::HugeData;
...
my $tokyo = $Your::HugeData::dictionary{tokyo};

当您在Linux Apache上使用prefork MPM时,操作系统更喜欢" Copy on Write"机制。 因此,如果您只读取数据,分叉子进程将查看父进程数据。 换句话说,可能没有浪费内存使用。

答案 1 :(得分:0)

我会考虑通过Storable store将其传递给文件,retrieve在开始时。

如果需要更改,您需要使用flock来仲裁IO,并且可能需要某种机制来检查它最后一次更改(例如检查mtime)。