我在 PHP 中用自定义二进制格式替换了 JSON

我们需要为 Web 和移动应用存储富文本。

多年来,我们在数据库中使用纯 HTML。后来,我们切换到了 JSON,以实现编辑与打印的分离。

随着数据量的增长,JSON 成为了一个问题。为了修改一个链接,我们必须解析、重建并对整个数组进行字符串化处理。这个过程既缓慢又低效。

我决定使用 PHP 构建一种自定义的二进制格式。

以下是我做出这一转变的原因:

  • 速度:解析和搜索变得快得多。
  • 控制力:我可以操纵特定的字节,而无需将所有内容加载到内存中。
  • 结构:我从嵌套树结构转向了扁平的元素列表。

大多数富文本任务并不需要复杂的树结构。你通常只需要查找文本或特定的标签。一种带有简单偏移量树的扁平元素结构效果更好。

PHP 不是一种低级语言。它不像 Zig 或 C 那样针对字节操作进行了优化。然而,PHP 拥有合适的工具:

  • pack() 将数字或字符串转换为原始字节。
  • unpack() 将这些字节转回可用的数据。

我停止使用多字节字符串函数。相反,我读取特定的字节块。例如,一个无符号 64 位整数正好需要 8 个字节。

10,000 次循环后的结果:

旧 JSON 编码:2.18s 旧 JSON 解码:0.86s 新二进制编码:1.19s 新二进制解码:0.67s

二进制格式更快,但体积也更大。它的体积是 JSON 的 2 倍,是 HTML 的 3 倍。由于我们使用服务端渲染,这对我们来说并不重要。

如果你要构建自定义格式,请遵循一个规则:编写规范。清晰地记录你的格式。否则你会后悔的。

这花了一周的工作时间。但非常值得。

来源:https://dev.to/tomj/i-replaced-json-with-a-custom-binary-format-in-php-mok