Я заменил JSON на собственный бинарный формат в PHP

Нам требовался более эффективный способ хранения форматированного текста для наших приложений и веб-сайтов.

Сначала мы хранили «сырой» HTML в нашей базе данных. Позже мы перешли на JSON, чтобы отделить процесс редактирования от вывода. JSON работал какое-то время, но по мере роста проекта возникли новые проблемы.

JSON стал слишком медленным для наших задач.

Когда нам нужно было искать и обновлять старые ссылки, приходилось парсить и пересобирать целые массивы. Этот процесс был медленным и неэффективным. Нам требовался формат, позволяющий быстрее манипулировать данными и использовать потоковую передачу.

Я решил создать собственный бинарный формат, используя PHP.

Многие разработчики считают, что PHP не предназначен для низкоуровневого управления байтами. Однако в PHP есть встроенные функции для этого:

  • pack(): преобразует числа или строки в «сырые» байты.
  • unpack(): преобразует эти байты обратно в числа или строки.

Я перестал использовать операции с многобайтовыми строками. Вместо этого я сосредоточился на чтении конкретных блоков байтов. Например, для беззнакового 64-битного целого числа требуется ровно 8 байт. При работе с бинарными данными точность имеет решающее значение.

Я также изменил структуру данных.

Большинство людей пытаются хранить документы в виде глубокой вложенной древовидной структуры. Часто это ошибка. Я перешел к плоскому списку элементов, таких как текст, теги и списки. Для восстановления HTML я использую простое дерево смещений (offsets). Это делает такие задачи, как поиск всех ссылок или очистка HTML, очень быстрыми.

Результаты 10 000 итераций показывают явного победителя:

Старое кодирование JSON: 2,18 с Старое декодирование JSON: 0,86 с

Новое бинарное кодирование: 1,19 с Новое бинарное декодирование: 0,67 с

Новый формат быстрее как при кодировании, так и при декодировании.

Бинарный формат занимает больше места, чем JSON или HTML. Он требует примерно в два раза больше пространства, чем JSON. Поскольку мы используем рендеринг на стороне сервера, это увеличение объема хранилища не влияет на производительность.

Этот компромисс того стоит. Теперь мы можем изменять ссылки и очищать HTML с помощью простых и быстрых функций.

Если вы создаете собственный формат, напишите четкую спецификацию. Она обязательно понадобится вам, когда вы вернетесь к этому коду позже.

Источник: https://dev.to/tomj/i-replaced-json-with-a-custom-binary-format-in-php-mok