
私は現在 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 チェックでデバッグ出力を検討してください。