PowerCMS™
2025年1月1日購入分よりライセンスの価格を改定いたします。
[ブログ] PowerCMS 6 でのアップデートまとめ を追加しました。
[よくあるご質問] システムログに「タスクを実行するために必要なロックを獲得できませんでした」というログが残っている を追加しました。
[よくあるご質問] 特定のシステムログに絞って確認できますか? を追加しました。

PowerCMS ブログ

ホーム > PowerCMS ブログ > 技術情報 > MT Cloud環境等のPSGI環境でプラグインやアプリケーションを開発する

2015年01月20日

MT Cloud環境等のPSGI環境でプラグインやアプリケーションを開発する

Movable Type や PowerCMS のプラグインをデバッグする方法は色々あります。以下のページなどが参考になるでしょう。

但し、MT Cloud環境ではいくつかの制約といいますか、前提があります。

  1. シェルログインができない
  2. PSGI環境であるため、システム>全般設定を保存するまでプラグインの修正が反映されない

特に2つめが不便です。私は OS Xで Transmit を使って Transmit 上でエディタでファイルを開き、コードを書いているのですが、コードの修正が即座に反映されず、当初はいちいち全般設定を保存していました。

これを解決するには、ひとつは MT Studio を使う手があります。MT Studioではコードを保存すると MTを再起動するようになているため、コードを修正して保存するたびに全般設定を保存する必要がありません。

もうひとつの方法は、作成しているプラグインがアプリケーション(MT::App::Foo)の場合、run_onceを指定するというものです。

type

run_once

PSGIサーバ上で動作するアプリケーションは、一度ロードされると再起動されるまで永続化されて動き続きます。これは、通常のアプリケーションであれば、パフォーマンスが向上するため好ましいのですが、一部のアプリケーションでは、好ましくない場合があります。(Movable Type の場合には、mt-upgrade.cgiはアップグレード実行時にのみ起動すればよいので、この例に当たります。)

この場合は、typeにrun_onceを指定します。

type: run_once

では、プラグインがアプリケーション(MT::App::Foo)でない場合はどうするかというと、コードの中に再起動の処理を入れてやります。

Movable Type が提供する各種アプリケーション(mt.cgiやt-comments.cgiなど)は、一度起動するとPSGIサーバ上で永続化されて稼働します。そのため、プラグインのinit時や、プラグインの処理中などに、メモリ上にキャッシュされたデータを更新したときには、起動しているインスタンスの再起動を行わないと反映がされません。インスタンスの再起動は、プラグインから明示的にアプリケーションに対して再起動を要求するメソッドを呼び出すだけです。

my $mt = MT->instance;
$mt->reboot;

上記のコードでは、現在のリクエストの処理が終了したタイミングで、アプリケーションの再起動が行われます。再起動されたアプリケーションは、別インスタンスとして起動しますので、メモリにロードされていたキャッシュなどは自動的に破棄されます。

それでは、開発中は常に再起動するように、完成後や本番適用後は常駐するようにしたい場合はどうすればよいでしょうか。

callbacks:
    MT::App::CMS::post_run:  >
            sub {
                my $app = MT->instance;
                if ( my $debug = MT->config( 'DebugMode' ) ) {
                    $app->reboot if ( $debug == 2 );
                }
            }

こうしておくことで、DebugMode指定が「2」の時には常に再起動するようになり、DebugModeの指定を外せば通常運用(常駐)とすることができます。すべてのプラグインで指定するのは無駄な処理に見えなくもないので、このようなプラグインを一つ作って入れておくと良いでしょう。 でも、Movable Typeにそういう仕組みが組み込まれると良いですね!

アルファサードでは、人材を募集中です。我こそは! というかたのご応募をお待ちしています。


カテゴリー
技術情報

Recent Entries