message.php 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. <?php
  2. /**
  3. * 消息类
  4. */
  5. class Message
  6. {
  7. /**
  8. * 消息最大长度
  9. */
  10. const MAX_SIZE = 1048576;
  11. /**
  12. * 保存的数据
  13. */
  14. protected $value;
  15. /**
  16. * 构造函数
  17. */
  18. public function __construct()
  19. {
  20. $this->value = [];
  21. }
  22. /**
  23. * 从原始数据尝试创建消息
  24. * @param string $buffer 待解析的数据,成功后会修改该数据的内容
  25. * @return Message|false 成功返回消息对象,失败返回false
  26. */
  27. public static function parse(&$buffer)
  28. {
  29. $len = strlen($buffer);
  30. if ($len < 4) {
  31. return false;
  32. }
  33. $arr = unpack('N', substr($buffer, 0, 4));
  34. $datalen = $arr[1];
  35. if ($datalen > self::MAX_SIZE) {
  36. return false;
  37. }
  38. if ($len < $datalen + 4) {
  39. return false;
  40. }
  41. $body = substr($buffer, 4, $datalen);
  42. $buffer = substr($buffer, 4 + $datalen);
  43. $msg = new self();
  44. $msg->set(json_decode($body, true));
  45. return $msg;
  46. }
  47. /**
  48. * 取数据
  49. * @param string $key 要取的字段名
  50. * @return mixed 字段的值
  51. */
  52. public function get($key = '')
  53. {
  54. return empty($key) ? $this->value : (is_array($this->value) && isset($this->value[$key]) ? $this->value[$key] : null);
  55. }
  56. /**
  57. * 设置数据
  58. * @param string|mixed $key 要设置的字段名,或完整的数据数组
  59. * @param mixed $value 要设置的值
  60. */
  61. public function set($key, $value = null)
  62. {
  63. if ($value === null) {
  64. $this->value = $key;
  65. } elseif (is_array($this->value)) {
  66. $this->value[$key] = $value;
  67. } else {
  68. $this->value = [$key => $value];
  69. }
  70. }
  71. /**
  72. * 将保存的数据转成原始数据
  73. * @return string 数据
  74. */
  75. public function toBuffer()
  76. {
  77. $buffer = empty($this->value) ? '' : json_encode($this->value);
  78. return pack('N', strlen($buffer)) . $buffer;
  79. }
  80. }