MTのインデックステンプレートの公開プロファイルを「公開キュー経由」にして、cronで定期的にrun-periodic-tasksをつかって再構築させる改良手順

MTのインデックステンプレートの公開プロファイルを「公開キュー経由」にして、cronで定期的にrun-periodic-tasksをつかって再構築させる改良手順の画像

なんでこんなことをする必要があるのかというと、コメントを投稿されたり、記事を更新するたびに、スタティックにしているインデックステンプレートの再構築が走って、結構な時間(5秒ほど)またされたりするのに嫌気がさしてきたからです。

もちろんCSSなど、ほとんど変化がなく再構築するタイミングの優先順位が低いものに対しては「手動」にしていますが、メインページや最新記事のフィードなどまで手動にしてしまうと、これまたいちいち記事を更新するたびに自分で手動再構築なんてメンドクサイことしていられないから「スタティック」にしてます。

でもね、これをスタティックにしていると、コメント投稿するだけの人でも、コメント投稿した記事ページだけを再構築するだけでいいのに、インデックステンプレートのスタティックまで再構築が走ってしまって、せっかくコメント投稿していただいている方を数秒待たせてしまうということになる。
数秒間もくるくると意味もなく待たされるとやっぱり人間イライラしてくるものです。
ということで、公開プロファイルを「公開キュー経由」にしてcronで1時間ごとにrun-periodic-tasksで再構築させることで、記事へのコメント投稿時間が「5秒」から「1秒」まで改善しました。

以下が設定手順です。

1. run-periodic-tasksスクリプトに実行権限を付与する

MovableTypeには、「run-periodic-tasks」というスクリプトが用意されてあります。
MTの公式ページの説明をご覧ください。指定日投稿や公開キュー等のスケジュール処理の設定
このスクリプトに実行権限を付与します。run-periodic-tasksはmtをインストールした箇所のtoolsフォルダの中にあります。
Linuxでのやり方は以下のとおり。例)mtインストールパス:var/www/html/mt

# cd /var/www/html/mt/tools/
# chmod +x run-periodic-tasks 

2. cronの設定をする

crontabでhourlyにぶち込むタイプで説明します。
他のやり方は上記の公式ページや、さくらスタンダードサーバーをつかっている方は、他の方のサイトになりますが、MTの記事を日時指定投稿する方法 -さくらインターネット編-を参考にしてください。

cron.hourlyにシェルスクリプトを作成する

# cd /etc/cron.hourly
# vi mt.sh

開かれたエディタ画面で以下をコピペする。
※mtフォルダへのパスは適宜変更してください。

#!/bin/sh
cd /var/www/html/mt
/usr/bin/perl ./tools/run-periodic-tasks
exit

入力が終わったら:wqをして保存する。

作成したmt.shに実行権限を付与する

# chmod +x mt.sh

3. プラグインをインストールする

定期的にインデックステンプレートを再構築するMovableTypeプラグイン「IndexRebuilder」をダウンロードしてくる。
インストールする前に、テキストエディタで開いて以下のfrequencyの値を3600秒に変更する。
※もともと15分に一度の再構築の設定となっているプラグインだけど、今回はhourlyとしてcronを一時間ごとに設定しているので3600秒にします。
もちろん、15分ごとがいいという人は、逆にcrontabの設定を15分ごとにしてください。

            $PLUGIN_NAME => {
                name        => $PLUGIN_NAME,
                frequency   => 3600,
                code        => \&_rebuilder,
            },

修正し終えたら、プラグインフォルダにアップロードする。

プラグインの設定をする

インデックステンプレートで、公開キュー経由にしたいテンプレートの公開プロファイルを変更する。
MT公開プロファイルを公開キュー経由に変更

同時に、変更したインデックステンプレートのURLを確認して、IDの数字を覚える。
MTテンプレートのID

プラグイン設定で、IndexRebuilderの設定箇所で、先ほど覚えたテンプレートIDを書きこむ。
複数の場合は、カンマ区切りで入力可能。入力したら変更を保存する。
IndexRebuilderのプラグイン設定

4. 動作確認をする

作成したシェルスクリプトを実行してみる

# cd /etc/cron.hourly
# ./mt.sh

実行後に、Movabletypeの管理画面で、システムの方のログを見てみよう。すると以下のように「スケジュールされたタスク」と表示されていたらシェルスクリプトは問題なく実行されている。
システムログ

また、一時間後にブログの方のログに以下のような「バックグラウンドパブリッシングが完了しました」と表示されていたら、再構築が実行されたことになる。ブログのログ

あとは、実際に再構築されているかページを見てみよう。

エラー表示が出て動かない場合

僕の場合は、シェルスクリプトを実行したときに以下のエラー表示があって正常に動かないサーバーがありました。

"my" variable $ext masks earlier declaration in same scope at /var/www/html/mt/tools/../lib/MT/CMS/Asset.pm line 1560.

この場合は、色々調べて原因エラー内容から原因を突き止めようとしましたが、結局のところ、run-periodic-tasksを修正することで問題なく動作するようになりました。

# vi run-periodic-tasks

で、エディタで開いて、一行目にある「#!/usr/bin/perl -w」の「-w」を削除するとなおりました。
ちなみに、エラー内容をもっと詳細に知りたい場合はrun-periodic-tasksを実行する際に「-v」を付けるとより原因を突き詰めやすいです。

# ./run-periodic-tasks -v