経緯
PHPで作成されたシステムで発行されたsession idを元に
Rubyからそのセッションに格納されている情報を知りたいかもしれないという状況が
あるかもしれない。
無事社会復帰を果たした会社で話題になったので調べてみた。
前々職の際にPHPとmemcachedに関して結構調査してたりしたので大分行けそうな気はしていた。
途中経過をメモ
PHPにてsessionに何かを保存する
今回は適当なデータを格納するスクリプトを作成
session.phpというファイル名で保存
#!/usr/bin/php <?php session_start(); echo $_SESSION['count'] = rand(1, 100); $_SESSION['testkey'] = 'hoge'; echo session_id(); echo "\n" ?>
実行してsession idを確認してみる
$ php session.php 66 f1sk3iprn07l2vu6a5e09dqd86 # これがデータを格納したsession id
memcachedにどのようなデータが格納されているか確認する
memcached-toolっていうコマンドを使ってmemcachedをいじれたりする
$ memcached-tool localhost:11211 dump Dumping memcache contents Number of buckets: 1 Number of items : 1 Dumping bucket 3 - 1 total items add memc.sess.key.f1sk3iprn07l2vu6a5e09dqd86 0 1435838226 30 count|i:66;testkey|s:4:"hoge";
先ほどのphpのスクリプトを実行して表示されたsession idの前に
「memc.sess.key.」が付いている。
ここをみるとPHPが勝手に付ける仕様のようだ。
セッションに格納していたデータは「count|i:66;testkey|s:4:"hoge";」このようにシリアライズ
されて保存されている。
phpの標準のserialize関数ではなくmemcachedの独自のシリアライズっぽい?
Rubyで取得してみる
memcachedのデータを扱うgemはそのままevan/memcached · GitHubを使ってみたのですが、ここでエラーが出たので断念。
phpで独自のシリアライズ保存されたデータだからそりゃそうなのだが…
ということでmperham/dalli · GitHubこちらを試してみた。
$ gem install dalli $ irb irb(main)> require 'dalli' irb(main)> dalli_client = Dalli::Client.new('localhost:11211') irb(main)> dalli_client.get "memc.sess.key.f1sk3iprn07l2vu6a5e09dqd86" => "count|i:66;testkey|s:4:\"hoge\";"
これでシリアライズされたデータが取得出来た。