MovableType の再構築プロセスはサーバに対する負荷が高く、深夜などのアクセスが集中する時間帯にこれを行なうと、再構築に失敗してエラーとなることが多々あります。そこでこの再構築プロセスの所要時間を知るために小さなプラグインを書いてみました。簡単なタグを埋め込むことで、 そのページの再構築に要した時間を知ることができるようになります。
以下のテキストエリアの内容をコピーして、mt-stopwatch.pl などのファイル名で MovableTypeのプラグインディレクトリに保存してください。
package MT::Plugin::StopWatch;
# MTStopWatch - Measure the performance along MovableType building process
# @see http://www.magicvox.net/archive/2007/03311636/
# Programmed by Piroli YUKARINOMIYA (MagicVox)
# Open MagicVox.net - http://www.magicvox.net/home.php
use strict;
use MT::Template::Context;
use vars qw( $MYNAME $VERSION );
$MYNAME = __PACKAGE__;
$VERSION = '0.10';
### Register plugin
if (MT->can ('add_plugin')) {
require MT::Plugin;
my $plugin = MT::Plugin->new;
$plugin->name ("${MYNAME} ver.${VERSION}");
$plugin->description (<<HTMLHEREDOC);
Measure the performance along MovableType building process.
HTMLHEREDOC
$plugin->doc_link ('http://www.magicvox.net/archive/2007/03311636/');
MT->add_plugin ($plugin);
}
### Enable the high-resolution time function, if you can.
eval {
use Time::HiRes qw( time );
};
### $MTStopWatch$
MT::Template::Context->add_tag (StopWatch => &stop_watch);
sub stop_watch {
my ($ctx, $args, $cond) = @_;
#
### Start a measurement in the slot specified by 'start'
if (defined (my $arg_start = $args->{'start'})) {
$ctx->{__stash}{__PACKAGE__. "::$arg_start"} = time ();
return '';
}
### Calculate the elapsed time since MTStopWatch appeared with 'start' param.
### @see also http://www.sixapart.jp/movabletype/manual/3.3/b_global_filters/#sprintf
if (defined (my $arg_stop = $args->{'stop'})) {
return (time () - $ctx->stash(__PACKAGE__. "::$arg_stop")) * ($args->{'magnify'} || 1);
}
return '';
}
1;
最新版のダウンロードやバグレポートはStopWatch の trac レポジトリでも行っています。
ページ下方の Download in other formats → Original Format で取得できます。
時間間隔を計測したい箇所の開始位置と終了位置に指定されたタグを埋め込んでページを構築するだけです。具体的にはテンプレートのできるだけ先頭近くに
<$MTStopWatch start="1"$>
と記述し、同様にテンプレートのできるだけ終端近くに
このページは <$MTStopWatch stop="1" magnify="1000" sprintf="%.3f"$> ミリ秒で再構築されました
と記述します。
精度の高い計測結果を得るためには、サーバに CPAN の Time::HiRes
モジュールがインストールされている必要があります。Time::HiResがインストールされていなくても動作はしますが、計測時間の精度が 1 秒単位となってしまうために実用性は殆どありません。
<$MTStopWatch stop="1" sprintf="%.3f"$> 秒
<$MTStopWatch stop="1" magnify="1000" sprintf="%.3f"$> ミリ秒