7

问题:

  • 我们需要将一个数组序列化为一个短字符串,越短越好。
  • 重要性更多地反映在较大的阵列上而不是较小的阵列上。
  • 该字符串将在获取请求中使用,因此必须对其进行 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

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

问题

解决这个问题的最佳方法是什么?我们如何呈现尽可能小的字符串?

附言

如果它很慢,这不是最大的问题,但它是一个需要考虑的变量。如果可能,该数组将被散列并从缓存中检索。

4

3 回答 3

2

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

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

在此处查看所选答案:如何在 PHP 中压缩/解压缩长查询字符串?


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

于 2013-03-27T18:44:55.430 回答
1
serialization = json_encode
compression = gzdeflate
urlsafe = base64_encode

urlencode不需要,因为base64_encode只产生安全字符。我会把它base64_encode留在那里。您可以考虑寻找更快的串行器或更快的压缩器。如果您的输入足够短,您甚至可以省略压缩器。


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

既然你想要short这意味着你需要在fast方面做出牺牲。


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

于 2013-03-27T18:23:44.190 回答
-1

尝试使用 gzcompress()函数

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

于 2013-03-27T18:22:14.300 回答