2009-12-01

MessagePack for PHP のarrayの扱い方について

php-msgpackでのarrayの扱い方については昨日はさらっと流してしまいましたが、arrayを実装するにしてもいろいろ方法があって悩ましいところなので、とりあえず保留しておきたかった、というのが正直なところです。

PHPでのarrayの扱い方として考えられるのは大きく分けて以下の3つくらいだと思います
  1. 不正なデータとして捨てる
  2. キーを調べてarrayかmapを判断する
  3. ユーザが指定できるようにする。

PHPだけでの使用を前提に考えると1が一番効率よいのですが、Cで書かれたサーバなどと通信するとなると不都合です。

2の方法はtake-hさんが採用されているようです。
http://tinyurl.com/yh6wgg4
この方法も考えては見たのですが、どうしてもパフォーマンスが犠牲になってしまうのであんまり実装する気は起きませんでした。

というわけで3の方法が使えるようにしたバージョンを作りました。
http://sui2.is-a-geek.net/trac/raw-attachment/wiki/php_msgpack/php5-msgpack-0.1.1.tar.gz

msgpackオブジェクトにオプションを指定することで、arrayを使うかどうかを選択できます。
$obj = new Msgpack;
$data = array("A", "B", "C");

$obj->setopt(MSGPACK_ENABLE_ARRAY, true);
var_dump(bin2hex($obj->packer($data)));

$obj->setopt(MSGPACK_ENABLE_ARRAY, false);
var_dump(bin2hex($obj->packer($data)));

 これを実行すると以下のようになります
string(14) "93a141a142a143"
string(20) "8300a14101a14202a143"

 unpackするときも同様です。
$data = pack("c*", 0x93, 0xa1, 0x41, 0xa1, 0x42, 0xa1, 0x43);

$obj->setopt(MSGPACK_ENABLE_ARRAY, true);
$obj->feed($data);
while ($obj->remain()) {
  var_dump($obj->unpacker(NULL));
}
$obj->setopt(MSGPACK_ENABLE_ARRAY, false);
$obj->feed($data);
while ($obj->remain()) {
  var_dump($obj->unpacker(NULL));
}
 実行結果
array(3) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [2]=>
  string(1) "C"
}
NULL

このようにユーザに適宜オプションを設定してもらうことで、2の場合程パフォーマンスを犠牲にせずにarrayをつかえますが、arraytとmapが入れ子になった場合には対応できません。


結局はオプションをいくつか用意してユーザが1~3を選べるようにするのが無難かなと思います。

0 件のコメント:

コメントを投稿

ZenBackWidget