tokyo tyrantでPHPのセッションサーバやろうとおもって失敗した話

PHPには、memcacheをセッションハンドラにする機能があります。
shimookaさんが簡単にご紹介されています


一方Tokyo Cabinet(以下TC)をネットワーク越しで使うTokyo Tyrant(以下TT)は、memcache互換のインターフェースがあります。


「・・・・もしかして、Tokyo Cabinetをストレージにできるんじゃね?そしたら永続化できるんじゃね」とおもったのが夕方。


仕事がおわってさっきためしてみました。
TCとTTはとりあえず、RPMを作ったんですが、ちょっと煩雑なので、id:perezvonTTはじめましたの記事のコンパイル方法参考にするといいかとおもいます。


TTのサーバを立ち上げて、(TTの1.0だとttservctlというスクリプトがありました。)

ttservctl start

php側の設定で、
php.iniに

session.save_handler = memcache 
session.save_path = localhost:1978

をして

<?php
session_start();
if (isset($_SESSION['count']) {
    $_SESSION['count']++;
} else {
    $_SESSION['count'] = 0;
}

として、ブラウザでアクセスしたら、ちゃんとカウントアップしてるし

/usr/bin/tcrmgr list localhost

でみたらちゃんとデータが書き込まれているようです。


・・・・・・が、ひとつ問題があって、memchacedは自前でGCの機能があるのでかってにデータが消えてくれるのですが、TTにはそれがないようです。(もともと適用範囲が微妙に違いますし当然といえます。)なので、別途GCの機構をどこかに用意してやらないとデータが消えてくれません。
というわけで別途考える必要がありそうです。


セッションの共有場所としてはレプリケーションもできるしかなり本命かとおもったけどもう一工夫誰かががんばる必要がありそうです。


Flaredもそろそろもう一度ちゃんといじりたいなーとおもいつつ、Tokyo DystopiaのRPMを作る僕がいるのでした。


ちなみに普通にmemcacheクラスから、TTを読み出せるので普通に使えそうです。

connect('localhost', 1978) or die ("接続できませんでした");
var_dump($tt->get('test'));
$tt->set('test', 1978);

いろいろ妄想は膨らむのですが、しばらくは適用する案件は手元にはなさそうです。
趣味でなんかやるかもしれません。