
Я пишу на модуле Apache, который в данный момент работает на 2.2.22. Модуль запускает скрипты, написанные на новом языке программирования, и для оптимизации кэширует результаты парсинга для последующих использований.
Поскольку кэшированный анализ должен быть удален при изменении файла, я сохраняю время изменения и проверяю его по файловой системе при каждом запуске.
Вот часть кода с отладочным сообщением:
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.