1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- <?php
- /**
- * 消息类
- */
- class Message
- {
- /**
- * 消息最大长度
- */
- const MAX_SIZE = 1048576;
- /**
- * 保存的数据
- */
- protected $value;
- /**
- * 构造函数
- */
- public function __construct()
- {
- $this->value = [];
- }
- /**
- * 从原始数据尝试创建消息
- * @param string $buffer 待解析的数据,成功后会修改该数据的内容
- * @return Message|false 成功返回消息对象,失败返回false
- */
- public static function parse(&$buffer)
- {
- $len = strlen($buffer);
- if ($len < 4) {
- return false;
- }
- $arr = unpack('N', substr($buffer, 0, 4));
- $datalen = $arr[1];
- if ($datalen > self::MAX_SIZE) {
- return false;
- }
- if ($len < $datalen + 4) {
- return false;
- }
- $body = substr($buffer, 4, $datalen);
- $buffer = substr($buffer, 4 + $datalen);
- $msg = new self();
- $msg->set(json_decode($body, true));
- return $msg;
- }
- /**
- * 取数据
- * @param string $key 要取的字段名
- * @return mixed 字段的值
- */
- public function get($key = '')
- {
- return empty($key) ? $this->value : (is_array($this->value) && isset($this->value[$key]) ? $this->value[$key] : null);
- }
- /**
- * 设置数据
- * @param string|mixed $key 要设置的字段名,或完整的数据数组
- * @param mixed $value 要设置的值
- */
- public function set($key, $value = null)
- {
- if ($value === null) {
- $this->value = $key;
- } elseif (is_array($this->value)) {
- $this->value[$key] = $value;
- } else {
- $this->value = [$key => $value];
- }
- }
- /**
- * 将保存的数据转成原始数据
- * @return string 数据
- */
- public function toBuffer()
- {
- $buffer = empty($this->value) ? '' : json_encode($this->value);
- return pack('N', strlen($buffer)) . $buffer;
- }
- }
|