enhydraの日記: mod_pluginclude.cの罠
サンプル用に書いたApacheモジュールが予想外にイイ塩梅で自分のサイトで思わず使ってみたくなる罠。
「Apache moduleにplugin機構をつけて気持ち良くなろう」みたいな原稿を書いている途中。dlopen()とかのダイナミックリンクインターフェイスはOSごとにAPIがばらばらでマイッチングなのだが、Apache APIはそれらを吸収するap_os_dso_*()な関数を持っている。(Apache moduleじゃなければGNU libtoolのlibltdlでも良いけど)元来mod_so.cでmoduleを実行時に組み込んで利用するためのしくみなのだが、ぷらっとふぉーむいんでぃぺんでんとな便利関数をApacheモジュールプログラミングに使わない手は無い。
ということでmoduleのmoduleの例を示すために、htmlに
#include file /etc/passwd
とか書くとパースしてファイルをインクルードするモジュールを書いた。fileだけが内臓機能で、pluginとして
echo.so
dir.so
httpget.so
をつけてみた。echo.soは
#include echo Hello
とか書くとHTMLにHelloとか出すだけ。dir.soは
#include dir /home
とか書くとディレクトリのファイル一覧をHTMLにインクルードする。httpget.soは
#include httpget http://example.jp/
とか書くと指定したURLからコンテンツを取ってきてインクルードする。
とまぁこれだけなんだけど、plugin書くのが
#include "httpd.h"
char *create_content(request_rec *r, char *arg)
{
return ap_pstrcat(r->pool, "mod_pluginclude.c example plugin: ", arg, NULL);
}
とかダケなのでらくちんぽん。たとえばRDF読んできて表示したりとかそーいうのがわりかしスカッと作れるっぽぃ。べつにpluginでperl組み込んで任意のスクリプトを実行できるようにしてもイイし。
ただし一個インクルードするたびにdlopen(), dlsym(), dlclose()してるので効率が少し悪い。テストに使っているPowerBook G4/500MHz/768MBでApache1.3.26 x 150で走らせると
#include file /etc/passwd
#include dir /Users/
とかパース後に1500byteになるHTMLで150[requests per second]ぐらい。同じサイズのstaticなhtmlで計測すると400[requests per second]ぐらいでフィードする。ここいらへんは毎回ロード/アンロードするんじゃなくてキャッシュさせれば余裕で改善できるはずだけど、とりあえずは問題ないスピードかしら。オブジェクトのサイズは40kbyte前後。
今作ろうとしているWebサイトが動的なものじゃ無くて、基本的に記事を掲載するだけのニュースサイトなのでちょうどイイかも。というわけで前書いていたmod_magdrive.cは開発中止。現時点で十分使えるあたりはどちらも同じなんだけど、構造的にmod_pluginclude.cの方がキレイ。
そして本題の執筆活動を忘れてコードを書いて遊んでいたら、実は明日(ってか今日)が仕事始めという驚愕の事実が発覚。やべー今日は土曜日だとばっかり思ってたYO! ←旅行ボケ
mod_pluginclude.cの罠 More ログイン