MessagePack-RPC の PHP 版のパッチ
MessagePack-RPC の PHP をクライアントにした時にこんなエラーが出る。
<?php require_once '../lib/Client.php'; $client = new MessagePackRPC_Client('localhost', '19850'); $ret = $client->call('echo', array('PHP PHP')); var_dump($ret);
PHP Fatal error: Uncaught exception 'Exception' with message 'hello PHP PHP' in /path/to/msgpack-rpc/php/lib/Client.php:30 Stack trace: #0 /path/to/msgpack-rpc/php/lib/Client.php(38): MessagePackRPC_Client->send('echo', Array) #1 /path/to/msgpack-rpc/php/test/sample.php(4): MessagePackRPC_Client->call('echo', Array) #2 {main} thrown in /path/to/msgpack-rpc/php/lib/Client.php on line 30
期待している値を渡して例外を発生している。
ソースを見ると配列の順番が仕様と逆になっている。
The response message is a four elements array shown below, packed by MessagePack format.
http://wiki.msgpack.org/display/MSGPACK/RPC+specification#RPCspecification-ResponseMessage
[type, msgid, error, result]
実際のソース。
msgpack-rpc/php/lib/Back.php
<?php -snip- public function clientRecvObject($recv) { $data = $this->msgpackDecode($recv); $type = $data[0]; $code = $data[1]; $sets = $data[2]; $errs = $data[3]; if ($type != 1) { throw new Exception($this->errorMessage02); } $feature = new MessagePackRPC_Future(); $feature->setErrors($errs); $feature->setResult($sets); return $feature; } -snip-
というわけでこういうパッチを当てると動く。
diff --git a/php/lib/Back.php b/php/lib/Back.php index 679b63d..12b9bec 100644 --- a/php/lib/Back.php +++ b/php/lib/Back.php @@ -44,8 +44,8 @@ class MessagePackRPC_Back $type = $data[0]; $code = $data[1]; - $sets = $data[2]; - $errs = $data[3]; + $errs = $data[2]; + $sets = $data[3]; if ($type != 1) { throw new Exception($this->errorMessage02); @@ -63,8 +63,8 @@ class MessagePackRPC_Back $data = array(); $data[0] = 1; $data[1] = $code; - $data[2] = $sets; - $data[3] = $errs; + $data[2] = $errs; + $data[3] = $sets; $send = $this->msgpackEncode($data); @@ -100,4 +100,4 @@ class MessagePackRPC_Back { return msgpack_pack($data); } -} \ No newline at end of file +}
ちなみにテストコードの server.php を動作させると
PHP Parse error: syntax error, unexpected T_UNSET in /path/to/msgpack-rpc/php/lib/Server.php on line 42
とか言われて全く動作しなかった。