これって,memcached を相手にしても同じことが起こるわけですよね.
memcached でも,異なるライブラリを使うアプリケーションでユーザ情報などを共有することはありえますよね.
memcache API の仕様はかなり適当なので,こういうことは起こるべきして起こった気がします.
BK だなぁ..
2009/7/24 Tomoya Hashimoto <tom...@gm...>:
> 橋本です。
>
> Kaiを異なるクライアントライブラリから利用する上での問題があります。
>
> PHPには2004年からあるmemcacheライブラリとlibmemcachedのラッパーであるmemcache'd'ライブラリの2種類があります。
>
> http://pecl.php.net/package/memcached
> http://pecl.php.net/package/memcache
>
> この二つのライブラリを用いて、Kai上のデータを受け渡せるか試してみました。
>
> --------------------------------
> $ more test2.php
> <?php
>
> // 昔からあるmemcacheライブラリで接続
> // http://pecl.php.net/package/memcache
> $n = new Memcache;
> $n->addServer("kai001",14013);
> $n->delete('hoge');
>
> $hoge['id'] = "hogehoge";
>
> $n->set("hoge", $hoge);
>
> echo "memcacheライブラリで接続\n";
> var_dump($n->get('hoge'));
>
> // 最近できたmemcachedライブラリで接続
> // http://pecl.php.net/package/memcached
> $m = new Memcached();
> $m->addServer("kai001",14013);
>
> // 同じキー名'hoge'をget
> echo "memcache'd'ライブラリで接続\n";
> var_dump($m->get('hoge'));
>
> exit;
> --------------------------------
>
> 当然、配列hogeが取れそうですがそうなりません。
>
> --------------------------------
> $ php test2.php
> memcacheライブラリで接続
> array(1) {
> ["id"]=>
> string(8) "hogehoge"
> }
> memcache'd'ライブラリで接続
> int(0)
> --------------------------------
>
> 原因ですが、memcachedのプロトコルが規定してるflgsにあります。
>
> set hoge 1 0 30
> a:1:{s:2:"id";s:8:"hogehoge";}
> STORED
>
> set hogeの後ろの'1'がflgsなのですが、プロトコルレベルでは利用方法に関してなにも決めていません。
> 昔からの'd'がないmemcacheライブラリでは'1'にシリアライズされたデータ、という意味を持たせています。
> 最近登場した'd'付きのmemcachedライブラリでは'1'にINT型の意味を持たせています。
>
> 上記のコードではこのflgsの意味解釈の違いで期待した動作になりません。
>
> キャッシュとしてのmemcachedでは問題になることはないですが、Kaiのように永続的に保持する場合は
> 異なる言語やライブラリから同じデータを取り出したいケースがあるように思います。そういうことを
> やりたいときは慎重に検証しないと"何で取れないんだ〜"と叫ぶことになります。
>
> #というか、そういう状態になってます。
>
> Kaiでなんとかする話ではないので、愚痴ですね。
>
> ------------------------------------------------------------------------------
> _______________________________________________
> Kai-users-ja mailing list
> Kai...@li...
> https://lists.sourceforge.net/lists/listinfo/kai-users-ja
>
--
Takeru INOUE
|