アルファサード株式会社 代表取締役 野田 純生のブログ


MovableTypeの体感速度を上げる。


公開日 : 2007-01-05 19:15:52


MovableType Background Rebuilder Plugin.の改良版。 一応β4ということで。

最新版はこちらから。

関連エントリ:

「別プロセスで再構築を行い、CMSの画面上は結果を先に返す」というのが基本的にやっていることなのだが、再構築は確かに早くなるが、負荷の面ではどうなんだろう。
それでもレスポンスを先に返すことで(実際には結果のページに先にリダイレクトしている)、明らかに体感速度は上がる。

今回の改良点は大きく分けて2点。

1点めは、改良というか機能の追加で、エントリーの編集画面でエントリーの「保存」「削除」をクリックした時のエントリーの再構築処理をバックグラウンド化してみた。

「保存」クリック→「GIFアニメーション表示」→「変更を保存しました。」

というのを

「保存」クリック→「変更を保存しました。」※再構築はバックグラウンドで。

今回はブログ全体の再構築の必要がないので、該当するエントリ、インデックス、前後のエントリのみを再構築する。バックグランドでの処理時間はだいたい2〜3秒。「変更を保存しました。」は正確には嘘だけど、「保存」→「変更を保存しました。」→「エントリーを確認」でエントリーを別ウィンドウで開いた時、まず再構築は終わっているから、ここはそのまま「変更を保存しました。」。
エントリーを公開状態から下書きに戻した際にも、インデックスと関連するアーカイブ、前後のエントリを再構築するようにしている。

同じくエントリーの編集画面からエントリーを「削除」した時、デフォルトの動作はエントリーの一覧画面が表示され、変更を反映するために「再構築してください」のメッセージが表示されるのだが、1つのエントリーを削除した時に全体を再構築するのは効率が悪いような気がしたのでここの処理も変えるようにした。 「削除」した時にはそのひとつ前か後($entry->previous、もしくは $entry->next)のエントリーに対して再構築をかけ(もちろんバックグラウンドで)、エントリーの一覧へリダイレクトする。

MT3.3はかなり再構築については考えられていると感じる。(ローカル環境で見ていると良く分かるのだが)ブログ全体に対して再構築をかけても、不要なファイルの更新はされないようになっている(ように見える)。

それでも、個別エントリーを保存した時にブログ全体に対して再構築をかけると(デフォルトテンプレートでエントリ数300、MacBook+SQLite+MT3.3)約7秒。一方個別エントリー、前後のエントリー、関連するアーカイブ+インデックス再構築だと2〜3秒。

後者の方が書くのは面倒だけど、そうするのが筋? かと思ってそのようにした。

もう一点は前回「フィードバック」を受け取る部分の改良。

Ajaxで非同期に結果を取得しにいくのが結局負荷を増やしてしまうことに繋がるので、せめて結果を受取りに行く動作の開始待ち時間を設定できるようにした。もちろん、結果が気にならない人は結果を受け取らないよう設定してもらえればその部分の負荷はかからない。デフォルトは3秒。

すべてデフォルト設定の状態の場合、
「バックグラウンド再構築」又は「すべてのブログを再構築」をクリック→「再構築プロセスを開始しました。」表示→3秒待つ→その後1秒毎に結果取得のCGIにアクセスを試み、結果が取得した時点で非同期通信はストップ。
その後の3秒で取得に失敗した場合はエラーを表示。各数値はプラグインの設定画面で設定できるようにしてあるので、環境やエントリー数によって最適な値を調整することで負荷を最小限にできると思う。


と、いうことで、あとはエントリー一覧画面からチェックボックス選択→「再構築」の部分かなぁ...と思いますが、仕事が始まっちゃったので、残りはいつできることやら...



このブログを書いている人
野田純生の写真
野田 純生 (のだ すみお)

大阪府出身。ウェブアクセシビリティエバンジェリスト。 アルファサード株式会社の創業者であり、現役のプログラマ。経営理念は「テクノロジーによって顧客とパートナーに寄り添い、ウェブを良くする」。 プロフィール詳細へ