Zend_Session

http://framework.zend.com/manual/ja/zend.session.introduction.html

なお、phpのセッションに関しては(今のところ中身があまりないが)sessionを参照。

とはいえ、Zend_Sessionは$_SESSIONを置き換えるものではなく、単純なラッパーである。従って$_SESSION以上の事は出来ないというのが大前提としてある。

つこてみる

Zend_Session_Namespaceをnewして、それに対してプロパティを設定する、、だけ。Zend_Session_Namespaceの引数を与えないとDefaultが利用される

    public function indexAction()
    {
        $sess = new Zend_Session_Namespace();
        if (!isset($sess->num)) {
            $sess->num = 0;
        }
        $sess->num++;
        Zend_Debug::dump($sess->num);
        Zend_Debug::dump($_SESSION);
        Zend_Debug::dump($_COOKIE);
    }

出力結果

int(9) // <- アクセスした回数

array(1) {
  ["Default"] => array(1) { // <- Zend_Session_Namespace::Defaultの中身
    ["num"] => int(9)
  }
}

array(1) {
  ["PHPSESSID"] => string(26) "eltcer02ju48ighscgs8po2km3" // <- いわゆるセッションID
}

名前空間を利用し、ロックしてみる

ここでは「Default」の他に「test」という名前空間を用意して、5アクセスあったら0に戻すという処理を入れてみる。

    public function indexAction()
    {
        $sess = new Zend_Session_Namespace();
        $sessTest = new Zend_Session_Namespace('test');
        if (!isset($sess->num)) {
            $sess->num = 0;
        }
        if (!isset($sessTest->num)) {
            $sess->num = 0;
        }
 
        if ($sessTest->num == 5) {
            $sessTest->lock();
        }
 
        $sess->num++;
        try {
            $sessTest->num++;
        } catch (Zend_Session_Exception $e) {
            //... 何らかの処理
        }
 
        Zend_Debug::dump($sess->num);
        Zend_Debug::dump($_SESSION);
        Zend_Debug::dump($_COOKIE);
    }

lockされたZend_Sessionオブジェクトに値を差しこもうとするとZend_Session_Exceptionがthrowされる。 ここではcatchしたものの何もしていないのでブロック的には下に落ちていて以下のような結果となる。

int(10)

array(2) {
  ["Default"] => array(1) {
    ["num"] => int(10)
  }
  ["test"] => array(1) {
    ["num"] => int(5)
  }
}

array(1) {
  ["PHPSESSID"] => string(26) "93eld8ql688j3vkt62uml5a7p0"
}

remembermeを使ってみる

基本的に、Zend_Sessionなりなんなりはcookieのexpire属性にずいぶんと過去の日付けを仕込んだセッションキーを飛ばしてくる。これにより、ブラウザを閉じたら値が復元できないようになっているわけだが、これを伸ばしたい時もあるだろうという事ね「属に言う認証時のRemember Meとかの機能」

ともあれ、実例を

    public function init()
    {
        Zend_Session::rememberMe(3600);
    }
 
    public function indexAction()
    {
        $sess = new Zend_Session_Namespace("remember");
        if (!isset($sess->num)) {
            $sess->num = 0;
        }
        $sess->num++;
        Zend_Debug::dump($sess->num);
        Zend_Debug::dump($_SESSION);
        Zend_Debug::dump($_COOKIE);
    }

これによりセッションが3600杪持続するようになる。なお、このメソッドは単純にCookieのexpireを伸ばしているだけではない。以下のような事を行っている。

  • cookieのexpireを指定された日時で上書きする(未来日付)
  • セッションIDをregenerateする
  • 古いセッションを破棄する

とりわけ、2、3の手法でもってリクエストがあった時に恒に新しいIDでのセッションを生成し、そこに値をコピーするようにしているわけだ。従って既存のIDを述ばしているだけでなく、新しいセッションを生成して新しいライフタイムを設定しているので、既存のIDに関してはGCの影響は受けないという事になる。とはいえ、gc.maxlifetimeを越えた時間を設定してもゴッソリ削りとられてしまう事がある(debianなどはとくにそう)ので、そういった場合はsave_pathを変えるなりなんなりしないといかんかもしれない。後述するmemcachedとか

(が、しかし、まれにregenerateがうまく走らないような時がある気もしなくもないんだよなー…)

memcachedを使ってみる

memcachedの設定がしっかりできていれば、そのように向けるだけ。

なお、以下は10杪でセッションが切れるような設定

 
    public function init()
    {
        $options = array(
            'save_handler' => 'memcached',
            'save_path' => '127.0.0.1:11211',
            'gc_maxlifetime' => 10 ,
            'gc_probability' => 1,
            'gc_divisor' => 1,
        );
        Zend_Session::setOptions($options);
        Zend_Session::start();
    }
zendframework/zend_session.txt · 最終更新: 2012/05/04 19:52 by admin
www.chimeric.de Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0