소스 검색

GatewayProtocol add body_is_scalar flag

walkor 10 년 전
부모
커밋
ae26921f2c
1개의 변경된 파일30개의 추가작업 그리고 6개의 파일을 삭제
  1. 30 6
      Workerman/Protocols/GatewayProtocol.php

+ 30 - 6
Workerman/Protocols/GatewayProtocol.php

@@ -12,6 +12,7 @@ namespace Workerman\Protocols;
  *     unsigned int        client_ip,
  *     unsigned short    client_port,
  *     unsigned int        client_id,
+ *     unsigned char      flag,
  *     unsigned int        ext_len,
  *     char[ext_len]        ext_data,
  *     char[pack_length-HEAD_LEN] body//包体
@@ -50,11 +51,14 @@ class GatewayProtocol
     // 判断是否在线
     const CMD_IS_ONLINE = 11;
     
+    // 包体是标量
+    const FLAG_BODY_IS_SCALAR = 0x01;
+    
     /**
      * 包头长度
      * @var integer
      */
-    const HEAD_LEN = 25;
+    const HEAD_LEN = 26;
     
     public static $empty = array(
         'cmd' => 0,
@@ -63,6 +67,7 @@ class GatewayProtocol
         'client_ip' => '0.0.0.0',
         'client_port' => 0,
         'client_id' => 0,
+        'flag' => 0,
         'ext_data' => '',
         'body' => '',
     );
@@ -90,13 +95,18 @@ class GatewayProtocol
      */
     public static function encode($data)
     {
+        $flag = (int)is_scalar($data['body']);
+        if(!$flag)
+        {
+            $data['body'] = serialize($data['body']);
+        }
         $ext_len = strlen($data['ext_data']);
         $package_len = self::HEAD_LEN + $ext_len + strlen($data['body']);
-        return pack("NCNnNnNN",  $package_len,
+        return pack("NCNnNnNNC",  $package_len,
                         $data['cmd'], ip2long($data['local_ip']), 
                         $data['local_port'], ip2long($data['client_ip']), 
                         $data['client_port'], $data['client_id'],
-                       $ext_len) . $data['ext_data'] . $data['body'];
+                       $ext_len, $flag) . $data['ext_data'] . $data['body'];
     }
     
     /**
@@ -106,18 +116,32 @@ class GatewayProtocol
      */    
     public static function decode($buffer)
     {
-        $data = unpack("Npack_len/Ccmd/Nlocal_ip/nlocal_port/Nclient_ip/nclient_port/Nclient_id/Next_len", $buffer);
+        $data = unpack("Npack_len/Ccmd/Nlocal_ip/nlocal_port/Nclient_ip/nclient_port/Nclient_id/Next_len/Cflag", $buffer);
         $data['local_ip'] = long2ip($data['local_ip']);
         $data['client_ip'] = long2ip($data['client_ip']);
         if($data['ext_len'] > 0)
         {
             $data['ext_data'] = substr($buffer, self::HEAD_LEN, $data['ext_len']);
-            $data['body'] = substr($buffer, self::HEAD_LEN + $data['ext_len']);
+            if($data['flag'] & self::FLAG_BODY_IS_SCALAR)
+            {
+                $data['body'] = substr($buffer, self::HEAD_LEN + $data['ext_len']);
+            }
+            else
+            {
+                $data['body'] = unserialize(substr($buffer, self::HEAD_LEN + $data['ext_len']));
+            }
         }
         else
         {
             $data['ext_data'] = '';
-            $data['body'] = substr($buffer, self::HEAD_LEN);
+            if($data['flag'] & self::FLAG_BODY_IS_SCALAR)
+            {
+                $data['body'] = substr($buffer, self::HEAD_LEN);
+            }
+            else
+            {
+                $data['body'] = unserialize(substr($buffer, self::HEAD_LEN));
+            }
         }
         return $data;
     }