パスワードを忘れた? アカウント作成
391650 journal

enhydraの日記: mod_pluginclude.cの罠

日記 by enhydra

サンプル用に書いた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! ←旅行ボケ

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

物事のやり方は一つではない -- Perlな人

読み込み中...