PHPでMemcacheを使うためのクラスとして
Memcache
と
Memcached
がある。
この時点で既にややこしい・・・
現場でモロモロ事情があり、Memcacheのほうでsetした値をMemcachedを使ってgetした際に上手く動かなくて、激ハマリしてしまった。
例えば、以下のようなプログラムがあったとする。
$host = 'localhost';
$port = 11211;
$array = array( 'name' => 'tadasuke' );
// Memcacheインスタンス作成
$mem = new Memcache();
// Memcahce接続
$mem -> connect( $host, $port );
// 値をセット
$mem -> set( 'test', $array );
// セットした値を取得
$result = $mem -> get( 'test' );
// 接続解除
$mem -> close();
var_dump( $result );
出力結果はこんな感じ。
array(1) { ["name"]=> string(8) "tadasuke" }
今度はこれをMemcachedを使って取得してみる。
$host = 'localhost';
$port = 11211;
$array = array( 'name' => 'tadasuke' );
// Memcacheインスタンス作成
$mem = new Memcache();
// Memcahce接続
$mem -> connect( $host, $port );
// 値をセット
$mem -> set( 'test', $array );
// セットした値を取得
$result = $mem -> get( 'test' );
// 接続解除
$mem -> close();
//var_dump( $result );
// Memcahcedインスタンス作成
$memd = new Memcached();
// Memcacheに接続
$memd -> addServer( $host, $port );
// セットした値を取得
$result = $memd -> get( 'test' );
// 接続解除
$memd -> quit();
var_dump( $result );
出力結果はまさかのこんな感じ。
int(0)
試しにsetする値を配列ではなくて数値や文字列にしてみたところ、MemcacheでもMemcachedでも同じように出力された。
どうも、MemcahceとMemcachedでは配列やオブジェクトをシリアライズさせる方法がが違うっぽい。
こんなん、分かるかいっ!!
というわけで、皆さん注意しましょうね。
MemcacheとMemcachedを両方使うっていうこと自体が、なかなかレアなケースだろうけど・・・