Psgi plackに対応したプラグインの作り方

yuji edited this page Nov 22, 2012 · 2 revisions
Clone this wiki locally

PSGI/Plackに対応したプラグインの作り方

Movable Type 5.2 以降のバージョンでは、PSGI/Plackへの正式対応が行われました。本文書では、プラグインや独自アプリケーション(MT::Appベース)をPSGI/Plackに対応させる方法について解説します。

PSGI/Plack環境上でMovable Type を稼働させる方法については、こちらを参照してください。

プラグインをPSGI/Plackに対応させる

通常のプラグイン

通常のプラグインであれば、PSGI/Plackに対応させることは特に難しいことはありません。いくつかの注意点に気をつけるだけで、大概の場合は動作します。(特殊なケースを除く)

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

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

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

MT::Appベースのアプリケーション

MT::AppベースのアプリケーションをPSGI/Plackに対応させるには、アプリケーションの定義情報にいくつかの情報を追加する必要があります。

script

CGIアプリケーションの実行ファイル名を返すサブルーチンをコードリファレンスで定義します。これは必須です。プラグイン利用者が実行パスを変更することを想定し、MT環境変数で変更できるようにしましょう。

 script: >
    sub {
        return 'new-app.cgi';
        # 又は、環境変数の値を返すように
        # return MT->config->NewAppScript
    }

cgi_path

PSGIサーバにマウントされるCGIアプリケーションのパスを返すサブルーチンをコードリファレンスで定義します。プラグインに定義されていない場合には、CGIPathが適用されます。プラグイン利用者が実行パスを変更することを想定し、MT環境変数で変更できるようにしましょう。

 cgi_path: >
    sub {
        return '/mt/test';
        # 又は、環境変数の値を返すように
        # return MT->config->NewAppCGIPath
    }

type

run_once

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

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

type: run_once

xmlrpc

また、XMLRPC::Liteを利用したアプリケーション(あまり無いかもしれませんが・・・)の場合には、XMLRPC::Transport::HTTP::Plackというモジュールを利用する必要があります。

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

type: xmlrpc

サンプルコード

上記の設定内容を踏まえたサンプルconfig.yamlは以下のようになります。

id: NewApp
name: NewApp

applications:
    newapp:
        handler: NewApp::App
        script: >
            sub {
                MT->config->NewAppScript;
            }
        cgi_path: >
            sub {
                MT->config->NewAppCGIPath;
            }
        methods:
            hello: $NewApp::NewApp::App::hello

config_settings:
    NewAppScript:
        default: new-app.cgi
    NewAppCGIPath:
        default: /mt/newapp

Movable Type EZ で動作するプラグインの場合には、上記の内容に加えて注意すべき点が若干あります。詳しい情報についてはこちらまでお問い合わせください。

関連情報