在修改文件时,Apache如何处理加载的模块?

我正在写一个当前运行在2.2.22上的Apache模块。 该模块运行用新的编程语言编写的脚本,为了优化,cachingparsing的结果以供连续使用。

由于在修改文件时应该删除caching的分析,因此我会存储修改时间并在每次运行时针对文件系统进行检查。

这是一些带有debugging信息的代码:

if (file->is_modified (mtime)) { ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "P* removing cached file"); files.erase(it); } 

我在testing时发现了什么(获取页面,修改文件,再次获取),是否永远达不到此块。 该文件被更改后再次parsing,但不是由于此检查。 它看起来像Apache本身正在检查修改时间,并释放模块中的所有内存。

parsing后的文件在未经修改的情况下被正确地重新使用。

这是Apache服务器的预期行为,如果是这样,这是叫什么,它在哪里logging?

检查caching程序的函数的完整代码

 shared_ptr<pstar_file> pstar_pool::get_file_handle ( request_rec *r, wpl_io &io, const char *filename, int mtime ) { pstar_map_t::iterator it; apr_proc_mutex_lock (mutex); // Check if a cached program exists it = files.find(filename); if (it != files.end()) { if (it->second->is_modified (mtime)) { files.erase(it); } else { apr_proc_mutex_unlock (mutex); return it->second; } } apr_proc_mutex_unlock (mutex); shared_ptr<pstar_file> file_ptr(new pstar_file(io, filename, mtime)); apr_proc_mutex_lock (mutex); files.insert(std::pair<string,shared_ptr<pstar_file>>(filename, file_ptr)); apr_proc_mutex_unlock (mutex); return file_ptr; } 

Github上的整个模块的完整代码(多个文件): https : //github.com/atlesn/P-star/blob/master/src/apache2/pstar_pool.cpp

这里有很多的背景。 不过,我觉得答案可能很简单。

当工作进程被实例化时,模块被加载。 加载模块时,通常会将其复制到内存中的过程映像中,而在磁盘上进行更改不会影响该过程映像。 这是否相关取决于你在自定义模块中做什么。

当然,当模块访问的文件被使用和改变时,apache并不会出现奇怪或未定义的行为。 如果你的模块打开一个文件,对于稍后修改该文件来做你所说的事情会很奇怪,尽pipe我觉得有一个原因可能是不清楚的。

还请检查底层文件系统是否按照您的预期方式实际存储和更新mtime。 它并不总是。 你的时间检查(你没有包括在内)也可能是错误的。

既然你说这个文件正在被一些未知的方式重新加载,那么很有可能每个请求都有一个新的工作进程被实例化,或者每次尝试都得到一个不同的工作者。

考虑在您的mtime检查打印debugging,以帮助隔离这一点。