<?php // serialized data $msgs = array(pack("C*", 0x93, 0x1, 0x2, 0x3, 0x92), pack("C*", 0x3, 0x9, 0x4)); // streaming deserialize $unpacker = new MessagePack(); $unpacker->initialize(); $buffer = ""; $nread = 0; foreach ($msgs as $msg) { $buffer = $buffer . $msg; while (true) { $nread = $unpacker->execute($buffer, $nread); if ($unpacker->finished()) { $msg = $unpacker->data(); var_dump($msg); $unpacker->initialize(); $buffer = substr($buffer, $nread); $nread = 0; if (!empty($buffer)) { continue; } } break; } } ?>
public function tryMsgPackSend($sendmg = null, $sizerp = 1024) { // TODO: Event Loop Implementation // TODO: Socket Stream while (true) { $read = null; $write = array($this->cltf); $except = null; $w = stream_select($read, $write, $except, 0, 100 * self::USECONDS); if ($w === false) { // TODO: error throw new RuntimeException('write stream'); } if ($w === 0) { continue; } // TODO: stream write $this->fwrite($sendmg); break; } $unpacker = new MessagePack(); $unpacker->initialize(); $buffer = ''; while (true) { $read = array($this->cltf); $write = null; $except = null; $r = stream_select($read, $write, $except, 0, 20000); if ($r === false) { // TODO: error throw new RuntimeException('read stream'); } if ($r === 0) { continue; } $buffer .= fread($this->cltf, $sizerp); $nread = $unpacker->execute($buffer, $nread); if ($unpacker->finished()) { break; } } $this->tryConnClosing(); $data = $unpacker->data(); $this->cbMsgsReceived($data); }