ブラウザで設定した内容からソースをカスタマイズして再生成する仕組みを作ったのですが、完全に反映されるタイミングが確定できなくて困っています。
ソースを生成する度に名前を変えるしかないのかなとか考えていますが、メモリをクリアする方法があればそっちのおうが良いのにと思って投稿しました。
プロセス単位になりますが
スレッドを使っている場合巻き添えに
なります。
1.各Perlプロセスでexitで終了させる
専用のソースを作り呼び出す処理を
呼び出す
ab
http://www.atmarkit.co.jp/flinux/rensai/apache15/apache15b.html
2.キャシュされる事を逆に利用する
グローバル変数にシステムの更新状態
を記録させる処理を行う。
キャシュされている状態が古い
場合は、終了時exitで終了する。
----------------------------------
Apache::exit(),CORE::exit
http://multix.jp/cgi-bin/cdiary2/2003-04-04.dml.html
モジュールのリリースアップをした場合
バージョンチエック用のプログラムを
呼出し呼び出されたプロセスグローバル変数
に現在のバージョンが保存されていると
するとその値と最新の値を比較して
違いを判断できる。
違いがある場合は終了させる。
よろしくお願いします。
まず、mod_perlでは、Apacheプロセスの中にPerlのメモリ空間が含まれているため、Apacheを切り離してメモリをリフレッシュすることはできないと思います。
その上で、以下のとおり回答いたします。
■課題となっている現象を整理させてください。
ブラウザで設定した内容からソースをカスタマイズして再生成する仕組みを作った
上記の「ソース」とはmod_perlのソース(HTMLソースではない)である認識でよろしいでしょうか。
■困っていることは以下の認識でよろしいでしょうか。
「mod_perlのソース(.pl)を自動生成する仕組みを作成したが、Webブラウザで.plを閲覧した際、タイミングによっては最新の.plではなく、古い.plの出力結果が表示される」
これが問題であれば、.pl実行時にモジュールを再読み込みするよう変更すれば回避できると思います。
■(本題に戻り)常駐する寿命をコントロールする方法
Apacheのバージョンはいくつでしょうか。
1.3系なら、Apacheの設定ファイルで「MaxRequestsPerChild」を指定することでプロセスの寿命をコントロールできます。
例えば、"1" を指定すると1つのリクエストを処理するたびに子プロセスが終了します。
■Apacheの再起動
ご存知かもしれませんが、Apacheを再起動する際に「apachectl -k graceful」などとすれば、現在処理をしている子プロセス・スレッドは処理を続行し、処理終了後に再起動します。
以上です。
ありがとうございます。つたない文章を的確にご理解していただいて恐縮です。ご解答をいただけるだけでも感謝ですのに、本当にすみません。
メモリのクリアって出来ないんですね。私が知らないだけなのか出来ないのか、無いことを調べるのが自信が無かったので大助かりです。
あと、寿命の方も時限指定は出来なくてところてん式なんですね。これだけ分かっただけでも収穫です。
ライブラリの読み込みは私も試したのですが、どうもうまくいかなくて、何かへましてるかもですので勉強しなおします。
MaxRequestsPerChild等を少なくするのは1人専用サーバを使うときにやってみます。
とても参考になりました。ありがとうございます。
ありがとうございます。ご解答いただいて感激です。
グローバル変数にバージョンを持たせるという発想は思いつきませんでした。なるほどです。
今回の件に限って言えば、ブラウザーからカスタマイズする意図が「プログラム知識の無い人にもカスタマイズできるようにする」ということだったので、バージョン違いで終了するときの見せ方を考えればなんとかなるかもです。
というか、私の都合について何も説明してなかったので、申し訳ありません。
大変参考になりました。ありがとうございます。