/** * 将一个数组打包成一个Key/Value的消息体 * * @param array $msg * @return string */ public static function toPack($msg) { $content = null; if (is_array($msg) == true) { foreach ($msg as $key => $value) { //这里是个约定,当value为null时,抛弃key. //因此,需要一个空key时候,请将value设置空字符串 if ($value === null) { continue; } //对value是数组的情况进行处理 if (is_array($value) == true) { $value = self::toPack($value); $keyvalue_len = strlen($key) + strlen($value) + 2 + 6; $keyvalue_len = $keyvalue_len | 0x80000000; } else { $keyvalue_len = strlen($key) + strlen($value) + 2 + 6; } $content .= pack("Nn", $keyvalue_len, strlen($key)) . $key . "" . $value . ""; } return $content; } else { if (is_null($msg) == true) { return $content; } else { self::$errno = ERR_PACKAGE_PACK_BAD_PARAM_TYPE; self::$error = '参数应该是null或数组'; return false; } } }
/** * 打包recv_data * * @param int $taskId s * @param string $data * @param integer $group * @param string $user * @param string $passwd * @param string $sign * @param boolean $zip * @return string */ function packRecvData($taskId, $data, $group = null, $user = null, $passwd = null, $sign = null, $zip = null) { $dataArr = array(); $dataArr[CWX_MQ_DATA] = $data; $dataArr[CWX_MQ_GROUP] = $group; $dataArr[CWX_MQ_USER] = $user; $dataArr[CWX_MQ_PASSWD] = $passwd; $kvPackage = CwxPackage::toPack($dataArr); //签名 if ($sign == CWX_MQ_CRC32) { $crc32 = crc32($kvPackage); $crc32 = pack('L', $crc32); $dataArr = array(); $dataArr[CWX_MQ_CRC32] = $crc32; $kvPackage .= CwxPackage::toPack($dataArr); } else { if ($sign == CWX_MQ_MD5) { $md5 = md5($kvPackage, true); $dataArr = array(); $dataArr[CWX_MQ_MD5] = $md5; $kvPackage .= CwxPackage::toPack($dataArr); } } //压缩 if ($zip == true) { $kvPackage = gzcompress($kvPackage); $header = new CwxMsgHead(MSG_TYPE_RECV_DATA, strlen($kvPackage), $taskId, 2, $this->version); } else { $header = new CwxMsgHead(MSG_TYPE_RECV_DATA, strlen($kvPackage), $taskId, null, $this->version); } //打包 $result = $header->toNet() . $kvPackage; return $result; }