tokyo tyrantでPHPのセッションサーバやろうとおもって失敗した話
PHPには、memcacheをセッションハンドラにする機能があります。
shimookaさんが簡単にご紹介されています
一方Tokyo Cabinet(以下TC)をネットワーク越しで使うTokyo Tyrant(以下TT)は、memcache互換のインターフェースがあります。
「・・・・もしかして、Tokyo Cabinetをストレージにできるんじゃね?そしたら永続化できるんじゃね」とおもったのが夕方。
仕事がおわってさっきためしてみました。
TCとTTはとりあえず、RPMを作ったんですが、ちょっと煩雑なので、id:perezvonのTTはじめましたの記事のコンパイル方法参考にするといいかとおもいます。
TTのサーバを立ち上げて、(TTの1.0だとttservctlというスクリプトがありました。)
ttservctl start
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);
いろいろ妄想は膨らむのですが、しばらくは適用する案件は手元にはなさそうです。
趣味でなんかやるかもしれません。