軽いブログシステムとは?

久々にITネタです。
最近ブログを自宅サーバで動かしている知り合いが数名いて

「WP動かしているけど重いんです」
「いま作ってみようとしてる」

と言っていたのを聞いて、前にブロガーのほうで「WEBサイトの構造を考える」というシリーズで僕もブログを設計しようとしていたのを思い出したので、久々につらつらと書いてみたいと思います。備忘録として。

前に書いていた記事の最終エントリーを改めて見ると

  • 記事データの保存・管理はDBで行う
  • 1記事1ファイルのgzipで圧縮されたXMLファイルとする
  • ファイル数の増大を防ぐため、ファイル数上限を設定し、ファイル数上限を超えた場合は古い記事のファイルから削除する
  • 削除された古い記事をロードする場合はサーバサイドスクリプトを介してDBからXML形式で取得する
  • 記事の投稿・編集を行うページはほぼ別アプリケーションとして構築する
  • JavascriptフレームワークjQueryを使用
  • サーバサイドスクリプトはPHPを使用、フレームワークZend Frameworkを使用


となっていました。今見直してみても僕の思うベストはこれだと思います。上記の内容でロード開始から表示までの流れを書くと

  1. ラッパーになるHTMLをロード
  2. Javascriptのlocationからアカウント名と日付・タグなどのパラメータを取得
  3. 取得したパラメータから個人設定データ・パラメータに対する制御データをJSON形式でサーバから取得
  4. 個人設定データを元にテンプレートXSL(静的ファイル)やその他のものをロード
  5. 制御データからロードすべき記事のXML(静的ファイル)をロード
  6. XSLTでHTMLを生成、表示


という感じでしょうか。リストを取得してAJAXXML記事ファイルをロード、表示するだけ。動的制御はクライアント側Javascriptで全部やる。HTTPリクエスト増えすぎるのが気になるけど、記事自体を静的ファイルにしておけばCPU使用時間は減るはず。画像もっさりのサイトに比べりゃたいしたことない。コメントの表示もDBレスで行ったほうがいいでしょう。たとえば記事ファイル名を20091117011501.xmlとしてコメントファイル名を20091117011501.comment.xmlとしたらファイル名で紐付けできるので後はJavascriptで制御してやればOKかと。
概ね2chのシステムの模倣に近いですね。
で、静的ファイルをロードさせるとなると、お分かりのように記事ファイル生成とファイルの管理ができるシステムを作る必要がありますが、まぁこれに関しては認証+CRUDの単純なものに毛が生えた程度でいいんじゃないかなとお茶を濁しておきます。
ただこの構造だとファイル数制限を行わないと膨大な数のファイルができてしまうので、新しく記事が生成された際に設定した世代前の古いファイルを削除し、ファイルが存在しない記事にアクセスされた場合は動的に記事を出力するアプリケーションへルーティングするような実装が必要かと思います。
そしてこのブログ閲覧システムを構築する際に目玉テクとなるのが流れの一番最後、Ajaxで取得したXMLとXSLをXSLTプロセッサに突っ込んでHTMLを生成する、名づけて「Ajaxslt」?です。これを簡単に実現するのがjQueryのライブラリ、jquery.ajaxslt.js。「WEBサイトの構造を考えるシリーズを書いていたときに作った(だが公開はしていない)んですがそういうことを忘れておりました。某社の社内システム"***検索"とかいう簡易検索アプリにも使ってみてますが、基本的にはjQueryでajax的XSLTで書いたものを肉付けして、簡単に使えるようなインターフェースをつけただけのものです。と言ってしまえば誰でも作れるでしょうし公開する必要ないかな。。。まぁそこそこ便利です。
あとはブログらしいRSSフィード生成/トラックバック/pingなどの機能を"うまいぐあい"につければ有名どころの重いブログシステムよりは軽くなるんじゃないかなーと思います。何よりも言いたいのは(いまさらではありますが)JavascriptはHTML/CSSデザインの補助用だけのものではなく簡単に超大規模な負荷分散ができるパワフル(笑)なツールなのです。

といったところで、こんなんどうでしょう、H[a-z]+とS[a-z]+お二方。