我在 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