【发布时间】:2011-12-26 08:41:52
【问题描述】:
假设我们的框架有两个模块:Handler.pm 和 Queries.pm
Queries.pm 是可选的,在 fastcgi 进程启动时加载
BEGIN {
&{"check_module_$_"} () foreach (Queries);
}
sub check_module_queries {
...
require Eludia::Content::Queries;
...
}
每个模块函数都加载到一个公共命名空间中
现在,Handler.pm 和 Queries.pm 中有两个同名函数(setup_page_content)
setup_page_content 在 Handler.pm 中被调用
看起来原作者建议 Queries.pm:setup_page_content 将在 Queries.pm 加载时被调用
有时它不会发生:在这些情况下,回溯(通过调用者 () 获得)表明 setup_page_content 是从模块 Handler.pm 调用的
我在通话前记录了 %INC,它包含 Queries.pm 以及在这些情况下的完整路径
这种行为是不一致的,并且在 2-3% 的生产安装尝试中会弹出,主要是在我发送两个并行相同的 http 请求时。由于大量的复制工作,我还不确定它是否是特定于安装的。
如何决定调用哪个版本的同名函数?
这是明确定义的行为吗?
应该是有原因的,原作者是这样写代码的
更新
perl 版本是v5.10.1 built for x86_64-linux-gnu-thread-multi
更新 2
代码:Handler.pm 和 Queries.pm
Queries.pm 加载发生在 check_module_queries(BEGIN {} of Eludia.pm)中,
使用Loader.pm(通过use Loader.pm <params>)为每个请求加载
【问题讨论】: