読者です 読者をやめる 読者になる 読者になる

遅延再構築とりあえず出来た。

静的生成と動的生成を組み合わせたいんですよ、の話の続き。

やりたいのは、こういう事だ

  • 何かする度に、全てコンテンツ再構築するようなのはヤダ
  • しかし、動的生成にして、毎回負荷かかるのもヤダ
  • 1回生成したやつは 静的な html ファイルとして保存しておけばよくね?

ちょろっと書いたら出来た

  • MT::Viewer を継承して
  • URLからFileInfoを拾って
  • WeblogPublisher::rebuild_from_fileinfo()を呼び出す
  • コールバック使って、WeblogPublisherがビルドしたコンテンツ(HTMLデータ)を受け取る

こんだけ。 ファイルやアーカイブのタイプ判定も何もせず rebuild_from_fileinfo 読んでるだけなのでViewerより楽。

既に継承する必要が無いな

.htaccess とかつかって

  RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /mt-delay.cgi?blog_id=1&uri=/nb/$1 [L]

こんな感じ(/nb はうちのブログのパス)にしておきゃ、404になる前にmt-delay が走るっつースンポーだ。

しかしだ、DB 中の FileInfo(パスとかアーカイブタイプとかの情報)はSyncしてくれるお節介野郎が居て、実ファイルが無いとDB中のFileInfoは消されちゃう。 アーカイブを動的生成する事にすれば、DB中のFileInfoと実ファイルの対応を取らないので ブログの設定自体は動的生成にしておく

じゃあ、それで良いかと思いきや、Weblog::Publisher はテンプレートの動的生成か否かをチェックして 動的生成なら実ファイル吐かない。 Weblog::Publisher2 とか適当に作って力技でやれない事も無いが、面倒なのでチート

        local *MT::Template::build_dynamic = sub { return 0;};

build_dynamic っつーサブルーチン(メソッド)を上書きしてる。 local なので、本当にチェックが必要なところまで汚染しない。

問題は、ファイルが無い時に参照されたら再構築するプロセスが走るので ファイルがある限り、明示的に再構築できない。 再構築したいファイルを消すようなスクリプト書かなきゃ。 プラグイン化した方が使い勝手良さそうだな

再構築の時間が遅くね? とか 404が出るたびに再構築しようとするの無駄じゃね? とか まぁ、しばらく様子を見よう