当文件被修改时,Apache 会对已加载的模块做什么?

当文件被修改时,Apache 会对已加载的模块做什么?

我正在编写一个当前运行在 2.2.22 上的 Apache 模块。该模块运行用新编程语言编写的脚本,并且为了进行优化,它会缓存解析结果以供后续使用。

由于修改文件时应删除缓存的解析,因此我存储了修改时间并在每次运行时根据文件系统进行检查。

这是带有调试消息的一些代码:

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

我在测试时发现(获取页面、修改文件、再次获取),这个块从未被到达。文件更改后会再次解析,但不是因为这个检查。在我看来,Apache 本身正在检查修改时间并释放模块中的所有内存。

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

这是 Apache 服务器的预期行为吗?如果是,它叫什么?在哪里有记录?

检查缓存程序的函数的完整代码

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

答案1

这里缺少了很多背景信息。不过,我认为答案可能很简单。

模块在工作进程实例化时加载。加载模块时,通常会将其复制到内存中的进程映像中,磁盘上的更改不会影响它。这是否相关取决于您在自定义模块中执行的操作。

当然,当模块访问的文件被使用和更改时,apache 不会表现出奇怪或未定义的行为。如果您的模块打开一个文件,那么稍后对该文件的修改会像您所说的那样,这很奇怪,尽管我感觉这其中可能存在一个尚不清楚的原因。

还要检查底层文件系统是否确实以您期望的方式存储和更新 mtime。并不总是如此。您的 mtime 检查(您未包括)也可能是错误的。

由于您说文件正在通过某种未知方式重新加载,所以很有可能每次请求都会实例化一个新的工作进程,或者每次尝试时都会得到一个不同的工作进程。

考虑在 mtime 检查中调试打印,以帮助隔离这个问题。

相关内容