読者です 読者をやめる 読者になる 読者になる

まっしろけっけ

めもてきなやーつ

PHPでmemcachedに保存されたセッション情報をRubyで扱う

経緯

PHPで作成されたシステムで発行されたsession idを元に
Rubyからそのセッションに格納されている情報を知りたいかもしれないという状況が
あるかもしれない。
無事社会復帰を果たした会社で話題になったので調べてみた。
前々職の際にPHPmemcachedに関して結構調査してたりしたので大分行けそうな気はしていた。
途中経過をメモ

環境

php.iniにて下記のように設定

session.save_handler = memcached
session.save_path = "localhost:11211"

memcachedlocalhostのport11211で動かしています。

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\";"

これでシリアライズされたデータが取得出来た。

まとめ

PHPで生成されたsession idを元にsessionに格納されたデータ(シリアライズされたデータ)を
取得することに成功した。

とりあえず今日はここまで
TODOは以下

しかし久しぶりにPHP書いたな