- 締切済み
perlの実行結果をキャッシュ
お世話になります。 perlの実行結果を一定期間キャッシュさせて、 キャッシュが存在しているなら、perlで処理させずに キャッシュを参照して表示させるようにできればと思っているのですが 何か効率の良い方法などありますでしょうか? 毎回、毎回処理をさせることなく、 一度処理したものはキャッシュさせて、 次回からはそのキャッシュを参照させて 少しでも負荷軽減になればと思っています。 ただ、ソケットを利用してWEBからデータを取得させているので、 一定期間になるとまたキャッシュを取り直す・・・ といったことをしたいのですが・・。 やっかいな事に1パターンではなく、 表示件数指定などもあり、ユーザーの設定によって 変化する部分が多いので、それごとにキャッシュをとらせる必要がありそうですが、動的に生成されるものをキャッシュさせる場合に 良い方法がありましたらご教授いただけましたら幸いです。 まだまだperl初心者枠のレベルだと思いますので できれば詳しく教えていただけましたら助かります。 宜しくお願い致します。
- miku881
- お礼率70% (7/10)
- Perl
- 回答数3
- ありがとう数2
- みんなの回答 (3)
- 専門家の回答
みんなの回答
#2です。 >そこでファイルのオープンエラーとなって止まってしまいます。 たしかに、検索キーワードを直接ファイル名として使うのはよくありません。 サーバーのOSによっては、オープンできなくなる文字でもファイルが生成できてしまうバグは確かにあるからです。 また、全角キーワードがありえる場合、文字コードを意識する必要もあってなかなか面倒です。 これを防ぐには、ファイル名は自前で生成したユニークなものを使用することです。 俺のシステムの場合、キーワードではなく、取得元URL(デコードしていないURLからスラッシュ等のみを除いたもの)を使っていました。 また、time の値とIPの組み合わせなど、ユニークな値になるような工夫をするのも手でしょう。 これを、キャッシュリストファイルを別に作ってキーワードと1:1で対応させるなどすれば、キーワードからローカルのキャッシュファイルを引っ張ってくることができます。 なおキャッシュリストファイルは、プログラムの先頭で連想配列に格納すれば、いざ使うとき高速にアクセスできます。
自分でテンポラリファイルを開いて、最終的な実行結果を格納するしかないと思います。 俺が自作しているフリーウェアは、構造の関係でそうやってます。 (なお、実行途中の中途半端なデータをパターンごとにキャッシュするのは、泥沼にはまる可能性があるので賛成できません) すでにソケットを使ったWEBアクセスを行っているなら、HTTPプロトコルの HEAD メソッドを使って、オリジナルが更新されたかのチェックができるはずです。(ただしオリジナルがCGIの場合、返値は信用できない) その値を参考にすれば、かなり効率よくキャッシュシステムが作れると思います。 なお、上述の通り俺は Perl でキャッシュシステムを組んだことがあるので、具体的なロジックに関する質問があるなら、もしかしたら答えられるかもしれません。 その際は補足欄に書いてください。
補足
ご回答ありがとうございます。 更新されたかどうかでチェックさせるというのは 無駄がなく素晴らしいです。 なかなか上手く説明ができなくて申し訳ないのですが、 yahoo!やgoogleのような検索エンジンのような検索システムを作り、 検索結果をキャッシュさせるといった事をしたいと思っています。 http://www.google.co.jp/search?hl=ja&q=%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5+%E5%88%B6%E5%BE%A1 例えば上記のようなGoogleの検索結果をキャッシュさせて、 次回、まったく同じ検索キーワードであれば、 ソケットで読み込まずに キャッシュファイルの方を表示させるようにしたいとすると、 私が考えられるのはqの値をファイル名にしておいて 検索結果をキャッシュファイルとして保存しておき、 このファイル名と検索窓に入力されたキーとの一致をもとにして キャッシュファイルがあるかどうかを チェックして、と言う流れしか思いつきません。 ただ、これだと保存させるファイル名によっては ファイル名が開けなくなってしまうらしく、 そこでファイルのオープンエラーとなって止まってしまいます。 deagle様のおっしゃるように、 オリジナルが更新されたかをチェックした上で、 更新されている場合のみキャッシュファイルを更新させると いった仕組みで、検索窓に入力されるキー別の結果を キャッシュさせるという流れができればと思います。 わかりづらい説明で申し訳ありませんが ご教授いただけましたら幸いに思います。
参考になるものが混ざっててくれるといいけど・・・ http://www.google.co.jp/search?hl=ja&q=%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5+%E5%88%B6%E5%BE%A1+perl+-%E4%BE%A1%E6%A0%BC+-ISBN+-2ch&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja
お礼
効率の良い検索方法を教えていただきましてありがとうございます。 色々勉強になるページがありました。
関連するQ&A
- キャッシュ処理でDBへのアクセスを軽減
キャッシュ処理でDBへのアクセスを軽減 お世話になっております。ちょっとしたシステムを作りレンタルサーバーへアップしようとしているのですが、表題のように、「キャッシュ処理でDBへのアクセスを軽減できるか?」といった旨の連絡をサーバ会社からいただきました。 http://○○○/~と、アクセスされたときDBを参照しDB内のデータを掲載するといった仕組みなのですが(これまで何度も同じような仕組みを作ってきている)、今回、「キャッシュ処理でDBへのアクセスを軽減できるか?」といった連絡を受け、自分の行ってきたものが誤っているのか?と皆さまのご意見を伺いたく投稿した次第です。 もちろん、テーブルの構成などによっても負荷は違ってくるかと想像出来ますが、「アクセスされたときDBを参照しDB内のデータを掲載するといった仕組み」といった内容程度しか伝えていないにも関わらずなので・・ また、この表題にあるキャッシュ処理でDBへのアクセスを軽減する・・ということを実現させるには、htmlファイルなど静的ファイルを作って・・という形になるのでしょうか? お忙しいなか恐縮ですが、アドバイスなどご意見を頂戴出来れば幸いです。 宜しくお願い申し上げます。
- ベストアンサー
- PHP
- PerlでSocketを閉じずに再利用する方法
インターネット上の情報を参考に作成したCGIでPerlのソケットを用いて通信を行っておりますが、CGIが呼び出されるたびに以下のような動作を行っております。 ソケット生成 -> ソケット接続 -> HTTP通信 -> ソケット切断 このうち、ソケットの接続におおよそ200ミリ秒ほどかかり、このレイテンシを減らすため、ソケットはCGIが呼び出されるたびに生成、接続するのではなく、最初からセッションを張った状態で、CGIが呼び出されるとHTTP通信部分のみを行うようにすることはできますでしょうか。 現在試したこととして、1回目の呼び出しでソケットをクローズせずに処理を終了し、2回目でソケットの生成、接続をせずに直接HTTP通信をしようとしてもうまくいきませんでした。 Perl、ネットワークプログラミング初心者なもので恐縮ですが、何卒よろしくお願いいたします。
- ベストアンサー
- Perl
- mod_perlのキャッシュについて
はじめまして、isi0033と言います。 下記のご回答宜しくお願い致します。 現在、レンタルサーバを借りてapache,mod_perlでシステムを構築しているのですが、潜在的なバグをもったプログラムにアクセスし、一度でも、ブラウザに『Internal Server Error』を表示されると、それがキャッシュとして残ってしまい、プログラムのバグを修正しても、『Internal Server Error』が表示されたりします。 何度かリロードすると正しく表示されるのですが、 とても安心して公開できません。 レンタルサーバでは、Apache::Registryが使われているようで、mod_perlについて色々調べると、Perlプログラムを読込んでコンパイルしたものをメモリにキャッシュするとありました。 このメモリをいったんクリアする設定or方法等、ご存知の人がいましたら、教えてください。
- ベストアンサー
- Perl
- キャッシュとサーバ負荷について
今までキャッシュを読み込む処理は、ブラウザの表示速度が上がる・サーバの負荷が軽減されると思っていました。 けれど最近「キャッシュを読み込むにしろ読み込まないにしろ、オンライン状態の場合一度サーバにデータの更新日時を問い合わせてキャッシュのデータよりも新しいデータがサーバにアップされていないかどうかを確認するので、サーバの負荷には関係ない」という文書を目にして、少々混乱気味です。 結局どちらの情報が正しいのでしょうか? また、クライアントのアクセス回数が非常に多く、ブラウザの表示が数秒間真っ白になる状態が起こるシステムなのでなるべくサーバの負荷を減らしたいと思っています。 キャッシュが関係なく、システム自体に問題が無いとすればこれ以上サーバの負荷は減らしようがないのでしょうか? 何だか漠然とした書き方ですが、御存知の方、回答お願いします。
- ベストアンサー
- Microsoft ASP
- CGIなのにIE8のときキャッシュが残ってしまう
jQueryの$.ajaxでPerl/CGIの出力結果を参照し、JavaScriptでそれを元に処理をしているのですが、XP/IE8環境でキャッシュが残ってしまう現象に遭遇し困っています。CGIの出力結果の時間に関係する処理なので、HTML上でタイムリーな表示にならず、とても困っています。Chrome、Firefox、Opera、Safariでは正常に動作しているのですが、IE8では動的であるCGIもキャッシュに残して参照する仕様になっているのでしょうか。
- ベストアンサー
- CGI
- Perlでイベント処理?
ようやくPerlに慣れてきて、ふと思ったのですが VBではイベントというものがあり、Perl Tkでもキーボード・マウスのイベントの処理ができる みたいですが、クライアントでソケット受信した場合、いつ受信するかわかりませんので ループしていれば良いのですが、ループしている間は、他の実行が何も出来ず効率も悪いなと 思うようになりました。 WindowsのPerl5.6を使っているのですが、ソケット等、イベント処理できる方法はあるのでしょうか?
- ベストアンサー
- Perl
- キャッシュを読まない方法
CGI(Perl)を実行するとファイルを読みに行き、毎回違った内容をブラウザに表示する。・・・というものを作ったのですがブラウザがキャッシュを先に見にいってしまい、(おそらく)CGIが実行しません。どうにかしてキャッシュを見に行かないようにしたいのですが。 助けてください。お願いします。
- ベストアンサー
- CGI
- perlからphpを実行して結果を得る方法
perlのプログラムから同一サーバー内のphpを実行してその結果を取得したいのですが、うまくいきません。 print.phpというファイルの中身が <? echo "<div>1234567890</div>"; ?> だとして、これをブラウザで見た場合のソースは <div>1234567890</div> となるわけで、この1234567890をperlのプログラム内で表示するために main.cgiというプログラム内で $data = '/***/www/print.php'; open(FH,$data); @list = <FH>; foreach $data_line ( @list ) { if ($data_line =~/<div>/ ){ $data_line =~ s/<div>//i; $data_line =~ s/<\/div>//i; print = $data_line; } } close(FH); のような処理をすると echo "1234567890"; という実行前のphpの中身が表示されてしまいます。 表示したい結果はこの場合ブラウザでphpを実行した時のソースからdivタグをperl側で抜き取った 1234567890 なのですが、同じ事をperlの書き換えで実現する上手い方法があればご教授いただけますと助かります。
- ベストアンサー
- CGI
- Perl から csh 実行
やまとです。 いつもありがとうございます。 Perl + csh を同時(?)に実行する方法を教えてください。 OSはSunです。 具体的にどのような処理を行いたいか簡単に説明しますと。 1.Perlでcshを実行(system関数?)し、cshで環境変数をセット(source)する。 2.cshで環境変数をセットしたら、ファイルを出力する処理が行われます。 3.Perlでcshによって出力されたファイルの内容を画面に表示します。 以下ソースを掲載します。(抜粋して) ================================================== = Perl ( test_perl.pl ) $data = "ABC"; $ret = system(`test_csh.sh $data`); ・ ・ ファイル(test.log)を開き、読込、画面に表示します(まだ作成してません。) ================================================== = Csh ( test_csh.sh ) source test_source.sh echo $1 > test.log ================================================== = test_source.sh setenv CLASSPATH .:/aaa・・・・・・ ↑ PATHの設定を行ってます。 ================================================== 画面に、「ABC」と出力させたいのです。 Perlからcshが実行されていないように思えるのですが、 Perlのsystem関数の使い方が誤っているのでしょうか? それとも、ClassPath等の設定をしなければならないのでしょうか? ちなみにコマンドから、 # test_csh.sh ABC と実行しますと、ファイルが出力され、かつ、sourceも実行されています。 Perlから実行する方法を教えてください。 説明が不十分であれば、補足いたしますのでご指摘ください。 宜しくお願いします。
- ベストアンサー
- Perl
- perlのソケットで
perlのソケットを利用してYahoo!の検索結果を取得させるように しているのですが、 ご不便をおかけして申し訳けございませんが、 ご覧になろうとしているページは現在表示できません と表示されるときがあり、制限?にひっかかるようになりました。 もともとソケットで取得させること自体に問題があるのでしょうか? 同じ所からある程度のリクエストがあれば このような状態になってしまうと思うのですが・・・。 何か良い方法がありましたらご教授いただけると幸いです。
- 締切済み
- CGI
お礼
すいません。 ちょっとスレッドと内容がずれてきましたので 新規スレッドにて質問させていただきます。 ご教授いただきまして、ありがとうございました。
補足
何度もご教授いただきましてありがとうございます。 おっしゃるとおりの方法でやってみたいと思います。 もう1つだけご教授いただけますと幸いです。 たとえば、以下のようにリストをlist.datへ保存させて、 キーワード1<>filename1<>time1<> キーワード2<>filename2<>time2<> 通常の配列の場合は open(IN,"list.dat"); while (<IN>) { ($key,$name,$time) = split(/<>/); if($FORM{'key'} eq $key) { last; } } のようにしてフォームで入力したものとマッチさせるような 形になると思いますが、連想配列を活用すると もっと効率よく高速に処理できるのでしょうか? もしよろしければソースを教えていただけましたら幸いです。