序列化一个数组并压缩字符串以在URL中使用它

时间:2013-03-27 18:16:22

标签: php serialization compression

问题:

  • 我们需要将数组串行化为短字符串,越短越好。
  • 重要性更多地体现在较大的阵列上而不是较小的阵列上。
  • 该字符串将在get请求中使用,因此必须对其进行url解码。

当前代码段

  /* 
    array (size=3)
      0 => string '/js/dhdbm78hdfb.js' (length=18)
      1 => string '/js/dfg4dg.js' (length=13)
      2 => string '/js/fg8hfhrt.js' (length=15)
      2 => string '/js/yjtdygj.js' (length=14)
      2 => string '/js/2q5g54rvfd.js' (length=17)
   */

  $json = json_encode($data);
  $gz = gzdeflate($json, 9);
  $base64 = base64_encode($gz);
  $paths = urlencode($base64);

  // outputs: i1aK0c8qjtFPyUhJyjW3yEhJS9LLKlbSgQmnpZukpCOLpKVbZKRlFJUgi1VmlaRUpmchCxkVmqabmhSVpaWARGMB

不是很令人印象深刻且非常慢,我认为应该有更好的方法来做到这一点...

问题

解决这个问题的最佳方法是什么?我们怎样才能呈现最小的字符串呢?

PS

如果它很慢,这不是最大的问题,但它是一个需要考虑的变量。在可能的情况下,阵列将被缓存并从缓存中重新获得。

3 个答案:

答案 0 :(得分:2)

如果您希望尽可能快速和小巧,请放弃通用工具并使用适合您要发送的特定数据的方法。去除所有数组值之间重复的任何内容(例如“/ js /”和“.js”),从序列化中删除所有数组语法,然后只发送一个字符串连接的唯一值列表,并重新构建它接收端。

如果必须,可以使用gz和base64_encode进一步压缩它,但是拥有唯一数据的一个缺点是必须唯一地表示它。

在此处查看所选答案:How to compress/decompress a long query string in PHP?


编辑: 你是否有余地来发布数据?这至少会避免与查询字符串相关的直接大小限制。它还可以避免为URL编码字符串,增加长度,并且您应该能够直接发送压缩内容,以节省大部分费用。

答案 1 :(得分:0)

serialization = json_encode
compression = gzdeflate
urlsafe = base64_encode
由于urlencode仅生成安全字符,因此不需要{p> base64_encode。我会将base64_encode保留在那里。您可以考虑寻找更快的串行器或更快的压缩器。如果输入足够短,你甚至可以省去压缩机。


算法具有两个维度的性能特征:指令数和内存使用量。通常你会发现,如果你试图减少一个,另一个上升。数据库中的索引允许快速查找但占用大量空间。无索引查找速度很慢,但不需要额外的索引空间。

由于您希望简短,这意味着您需要根据快速做出牺牲。


老实说,我认为你在这里有一个非常优化的设置。

答案 2 :(得分:-1)

尝试使用gzcompress()功能

http://php.net/manual/en/function.gzcompress.php