Apache、mod_perlにおけるpnotesのようにリクエスト単位でデータを保持できるPlack::Middlewareをリリースしました。実装にはScope::Containerを利用しています。

使い方は簡単Plack::BuilderでScope::Containerのmiddlewareを有効にします

use Plack::Builder;

builder {
    enable "Scope::Container";
    $app;
};

とくにオプションなどはありません。

これでリクエストがあった際にScope::Containerのstartscopecontaierを呼んでくれるので、アプリケーションのなかでscope_containerを使って簡単にデータの出し入れが行えます。

以下はHTTP接続をリクエストの間だけKeepAliveするサンプル

package MyApp::UA;

use Scope::Container;
use LWP::UserAgent;

sub getua {
    if ( in_scope_container() && my $ua = scope_container('ua') ) {
        return $ua;
    } else {
        my $ua = LWP::UserAgent->new(keep_alive=>1);
        scope_container('ua', $ua) if in_scope_container();
        return $ua;
    }
}

package MyApp;

sub app {
  my $env = shift;
  $ua = MyApp::UA->getua(); # new instance
  $ua = MyApp::UA->getua(); # from container cache
  $ua = MyApp::UA->getua(); # from container cache
  return [ '200', [] ["OK"]];
  # disconnect keepalive and destroy $ua
}

もちろんWebアプリケーションだけに限れば、$envでも実現できることは多いですが、Scope::Containerを使うことでモデル層のモジュールをWebのリクエスト/レスポンスの世界とを疎となるように構築し、必要な場所に限ってMiddlewareでそれを結びつけることができます。

このブログ記事について

このページは、Masahiro Naganoが2010年11月11日 00:00に書いたブログ記事です。

ひとつ前のブログ記事は「ログレベルの使い分け方/コミュニケーション手段としてのログ」です。

次のブログ記事は「HTMLのscriptタグ内にデータを埋め込む際のエスケープ処理モジュール書いた」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

OpenID対応しています OpenIDについて
Powered by Movable Type 4.27-ja