CML on lighttpd

This entry was posted by on Sunday, 19 February, 2006
>で、その lighttpd には CML (Cache Meta Language) という奇妙なモジュールがあります。これは、スクリプトを実行するなどの動的なコンテンツを持っているときに、スクリプトを実行するかわりにキャッシュからデータを持ってきたりすることで負荷の軽減化を計るという処理を記述できる言語です。ちなみに言語じたいは Lua を使っています。 Lua とはまた渋い。 > >どういう風につかうか。以下、 >lighttpd の CML のマニュアル >と同じよーな説明ですが、簡単に書いてみます。 > >たとえば、ある test.cgi が適当な出力を吐くとします。こんな感じ。 > >#!/usr/local/bin/ruby
require 'cgi'
cgi = CGI.new
cgi.out { some_proc(File.read("content")) }
> >このとき、 content というファイルの中身が変わらなければ、 test.cgi の動作じたいは変わりません。なのに毎回この cgi を実行させて some_proc を実行するのはアホらしいので、キャッシュを利用します。 > >#!/usr/local/bin/ruby
require 'cgi'
cgi = CGI.new
cachefile = "_cache"
unless cache_valid?(cachefile, "content") then
File.open(cachefile, "w") { |fio| fio.print some_proc(File.read("content"))}
end
cgi.out { some_proc(File.read("_cache")) }
> >でもやっぱり cgi としてプロセスを駆動させないといけません。 cml を使えば、サーバに組込まれたかたちでキャッシュを利用してファイルの中身を書き出すといったことができます。 > >cgi の側は、キャッシュを使わなくてよいのでこうなります。 > >#!/usr/local/bin/ruby
require 'cgi'
cgi = CGI.new
cachefile = "_cache"
File.open(cachefile, "w") { |fio| fio.print some_proc(File.read("content"))}
cgi.out { some_proc(File.read("_cache")) }
> >一方、 test.cml なるファイルを作成し、こちらでキャッシュを取り扱うということです。中身は次のような感じ。 > >cwd = request["CWD"]
cachefile = cwd .. "_cache"
trigger_handler = "test.cgi"
output_file = { cachefile }
if file_mtime(cwd .. "content") > file_mtime(cachefile) then
return 1
end
return 0
> >Lua はあんまり詳しくないのですが、それほど複雑なロジックは使っていないので問題ないでしょう。 .. は文字列の連結。 CWD はおそらくカレントワーキングディレクトリでしょう、スクリプトの設置してあるディレクトリです。 file_mtime はファイルの最終更新日時ですね。数値が返るので大小比較が可能になっています。つまり、 content というファイルと cachefile の更新日時を比較しています。 > >cml のポイントは返戻値にあります。 1 は失敗、0は成功の意味です(lighttpdのマニュアルでは CACHE_MISS と CACHE_HIT が使われている例もあるのですが、なぜか手元では動きませんでした。ちゃんと CACHE_MISS が1で CACHE_HIT が0と定義されてるみたいなんだけどなあ)。成功すると、 output_file で指定したファイルを(順番に)出力します。一方、失敗すると trigger_handler で指定したスクリプトを実行します。で、今回の例では、作成した test.cml にアクセスすると「content の方が新しければ test.cgi を駆動してキャッシュを更新しつつ表示。以降のアクセスが来ると test.cgi は無視してキャッシュの中身を書き出す」という動作になります。 > >cml は lighttpd 内に組込まれて動作するのでプロセスを起動する必要もなく、高速かつ低負荷に動作するとのこと。なんかたぶん、 apache でいうところの mod_* のような仕組みを使えば同じようなことはできるような気はしますし、その場合はその言語のロジックも記述できるからもっと柔軟な気はします。ただまあ、言語ごとにいろいろ用意するのではなくて「出力をキャッシュする」という仕組みに絞って、スクリプトのロジックと分離して機能を提供するってのはなかなか面白いんじゃないですか、と思います。 > >ま、あんまり凝ったことは出来ないでしょうけれど、たとえば「同じようなデザインで、コンテンツとなるファイルだけを差し替える」とかいったケースでもなかなか有用なのではないかと思います。 >

Comments are closed.