私の理解が正しければ、クエリの結果を保存して、別のプロセスで再度使用できるようにしたいと考えています。これにはいくつかの方法がありますが、いずれもある種のキャッシュを設定する必要があります。
CGI プロセスには別のメモリがあるため、要求したことを直接実行することはできません。さらに悪いことに、それらはリクエストごとに開始および停止され、コンパイルに多くの時間を浪費します。ただし、それを回避する方法はたくさんあります。
SQL クエリが高価で、データが頻繁に変更されない場合は、データベースに結果をキャッシュさせることができます。たとえば、MySQL キャッシュは次のとおりです。これには、データベースを使用するすべてのものがそれを使用するという利点があります。欠点は、プログラムがすべてのデータを取得して処理する必要があることです。これを使用すると、クエリは高価ですが、フェッチと処理はそれほど高価ではなく、データは頻繁に変更されません。
もう 1 つのオプションは、 memcachedなどの外部キャッシュを設定して、結果を保存することです。Memcached は基本的に、データの大きなハッシュを格納するマシン上のサーバーです。または、データベース自体を使用して、処理された HTML テーブルをキャッシュすることもできます。各プロセスは、自分で計算する前に、必要なデータがキャッシュにあるかどうかを確認できます。CHIのようなものを使用して、それとやり取りすることができます。利点は、必要なものを何でもキャッシュに入れることができることです。欠点は、自分でキャッシュを管理しなければならないこと (つまり、データがなくなったときにデータを削除すること) であり、別の管理が必要であり、キャッシュはいつでも消える可能性があります。
最後に、プロセスの実行方法を変更できます。基本的な効率向上は、要求ごとにプログラムを開始、コンパイル、実行、および終了する単純な CGI から、独自の小さなサーバーでプログラムを実行するFastCGIのようなものに変更することです。while
プログラム全体にループを配置するようなものだと考えてください。プログラムは各リクエスト間でシャットダウンしないため、データをグローバル変数に保存できます。次に、@foampileが提案したことを実行したり、テーブルを保存しour @Table_Cache
たりするのは簡単なことです。これにより、そのプロセスではキャッシュされますが、他のプロセスではキャッシュされません。それぞれの異なるプログラムは、独自のプロセスです。だからfoo.cgi
共有しないbar.cgi
. 利点は簡単なことです。FastCGI はとにかく切り替える必要があり、Web サーバーはおそらく既にサポートしています。欠点は、キャッシュを管理する必要がある (つまり、古いエントリを削除する) ことと、プロセス間で共有されないことです。
FastCGI から始めて、パフォーマンスの問題が解決するかどうかを確認します。これは、リクエストごとではなく、サーバーの再起動ごとに各クエリを2 回だけ実行することを意味します。