« 「改訂新版 Movable Type 標準ハンドブック」明日発売です | メイン | エントリ投稿時の500エラーを強引に回避する方法、おかわり »

2006年11月 2日

エントリ投稿時の500エラーを強引に回避する方法[ トラブルシューティング ]

最近ときどきエントリを投稿しようとしても500エラーでまったく投稿できないというときがありました。
エントリの投稿画面で「保存」ボタンを押しても、なんの反応も無くしばらくすると500エラー。
何とかならんもんだろうか、と思って、ちょっと試してみたのですが結構効果があったので、書いてみたいと思います。
方法は簡単で、mt-tb.cgiとmt-comments.cgiを投稿するときだけリネームするなりして無効にします。
エントリの投稿をしようとする前に、この2つのファイルをリネームします。とりあえず、ファイル名の最初に適当に1文字入力しておくとかで良いと思います。
で、ゆっくりエントリを書いて、投稿が終わったら元の名前に戻す、と。
手間はかかりますが、結構効果的な気がしています。
おためしあれ。

あ、で、話は変わりますが、「改訂新版 Movable Type 標準ハンドブック」本日発売です!
よろしくお願いしますー。

平田 大治 関根 元和
インプレスジャパン

でもやっぱめんどくさいので、プラグインにしてみました。
リネームしっぱなしになっちゃうことも、もしかするとあるかもしれないですけども……。

[追記]
たぶん、XML-RPC経由やAtomAPI経由、モブログなどで投稿するとリネームしっぱなしになる可能性がありそう。これ、なんとかならんもんだろうか……。

package MT::Plugin::Silence;

use strict;
use MT::Plugin;
@MT::Plugin::Silence::ISA = qw(MT::Plugin);

use vars qw($PLUGIN_NAME $VERSION);
$PLUGIN_NAME = 'Silence';
$VERSION = '0.50';

use MT;
my $plugin = new MT::Plugin::Silence({
    name => $PLUGIN_NAME,
    version => $VERSION,
    description => "Silence",
    author_name => 'CHEEBOW',
    author_link => 'http://cheebow.info/chemt/',
});

MT->add_plugin($plugin);
MT->add_callback('CMSPreSave.entry', 9, $plugin, \&CMSPreSave_entry);
MT->add_callback('MT::App::CMS::AppTemplateOutput.edit_entry', 9, $plugin, \&hdlr_edit_entry_source);

sub instance { $plugin; }

sub _rename_scripts {
    my ($app, $dir) = @_;

    my $tb_script = File::Spec->catfile($app->{mt_dir}, $app->config('TrackbackScript'));
    my $comment_script = File::Spec->catfile($app->{mt_dir}, $app->config('CommentScript'));
    
    my $renamed_tb_script = $tb_script . ".$PLUGIN_NAME";
    my $renamed_comment_script = $comment_script . ".$PLUGIN_NAME";
    
    my ($from_tb, $to_tb);
    my ($from_comment, $to_comment);
    if ($dir == 0) {
        $from_tb = $tb_script;
        $to_tb = $renamed_tb_script;
        $from_comment = $comment_script;
        $to_comment = $renamed_comment_script;
    } else {
        $from_tb = $renamed_tb_script;
        $to_tb = $tb_script;
        $from_comment = $renamed_comment_script;
        $to_comment = $comment_script;
    }

    rename($from_tb, $to_tb) if -e $from_tb;
    rename($from_comment, $to_comment) if -e $from_comment;
}

sub CMSPreSave_entry {
    my ($cb, $app, $entry) = @_;
    
    _rename_scripts($app, 0);
}

sub hdlr_edit_entry_source {
    my ($eh, $app, $tmpl_str_ref, $param, $tmpl) = @_;

    return unless $param->{saved_changes};

    _rename_scripts($app, 1);
}

1;


MovableTypeするならおすすめです!

投稿者 CHEEBOW : 2006年11月 2日 12:26