2004年10月25日
リビルド終了を待たずにコメント動作を完了
Movable Typeでコメントを書き込むと、リビルド動作を伴うので終了までずいぶん待たされることがある。
jm@foo: コメント時のリビルドではお知らせメール機能を利用してインデックスのリビルドを非同期で行う方法を試したが、アーカイブの種類が多かったりするとこのやりかたでもまだまだ遅い。そこで以下の改造をしてみた。
jm@foo: コメント時のリビルドにも書いている、forkする方法。要するに、同期してリビルドしなければならないIndividual Entryアーカイブ以外は子プロセスとして裏でゆっくりリビルドしてもらい、親のプロセスはさっさと終了する。
lib/MT/App/Comments.pmの190行目、
$comment->save;
$app->rebuild_entry( Entry => $entry )
を
$comment->save;
my $pid = fork();
if (!$pid) {
close STDOUT;
$app->rebuild_indexes( Blog => $blog )
or return $app->error($app->translate(
"Rebuild failed: [_1]", $app->errstr));
exit;
}
$app->rebuild_entry( Entry => $entry )
に変更。さらに lib/MT.pmの196行目
return 1 if $blog->is_dynamic;
my $at = $blog->archive_type;
if ($at && $at ne 'None') {
my @at = split /,/, $at;
for my $at (@at) {
if ($at eq 'Category') {
my $cats = $entry->categories;
for my $cat (@$cats) {
$mt->_rebuild_entry_archive_type(
Entry => $entry, Blog => $blog,
ArchiveType => $at, Category => $cat,
) or return;
}
} else {
$mt->_rebuild_entry_archive_type( Entry => $entry,
Blog => $blog,
ArchiveType => $at
) or return;
}
}
}
を
return 1 if $blog->is_dynamic;
$mt->_rebuild_entry_archive_type( Entry => $entry,
Blog => $blog,
ArchiveType => 'Individual'
) or return;
my $pid = fork();
if (!$pid) {
close STDOUT;
my $at = $blog->archive_type;
if ($at && $at ne 'None') {
my @at = split /,/, $at;
for my $at (@at) {
if ($at eq 'Category') {
my $cats = $entry->categories;
for my $cat (@$cats) {
$mt->_rebuild_entry_archive_type(
Entry => $entry, Blog => $blog,
ArchiveType => $at, Category => $cat,
) or return;
}
} elsif ($at eq 'Individual') {
} else {
$mt->_rebuild_entry_archive_type( Entry => $entry,
Blog => $blog,
ArchiveType => $at
) or return;
}
}
}
exit;
}
に変更。
でもMTの3.1ではリビルドを非同期で行うか否かの設定もできるようになっているみたいなので、バージョンアップするのが一番いいかも。
Posted by jiro at 2004年10月25日 15:41
| トラックバック (0)
コメント
コメントする