Substituí o JSON por um Formato Binário Customizado em PHP

Arquitetura PHP Back-end
Substituí o JSON por um Formato Binário Customizado em PHP

Este artigo foi publicado originalmente por Tom J. em tomj.pro.

A Evolução do Armazenamento de Rich Text

Armazenar texto rico (rich text) para aplicações web e UIs sempre foi um desafio. Antigamente, muitos desenvolvedores começavam com HTML puro no banco de dados. Quando surgiu a necessidade de separar a edição da renderização, o JSON tornou-se a escolha padrão. No entanto, com o crescimento das necessidades de manipulação de dados, até o JSON encontrou seus limites.

Por que o JSON não era mais suficiente

O JSON é excelente para legibilidade, mas carece de otimização em velocidades de construção e parsing em larga escala. Ao realizar operações em massa — como buscar e substituir links antigos em milhares de registros — processar e converter grandes arrays torna-se um gargalo significativo. Além disso, para conteúdos extensos que precisam ser transmitidos via stream, um formato mais eficiente era necessário.

Implementando Binário em PHP

Embora o PHP seja uma linguagem de script de alto nível, ele fornece as ferramentas necessárias para o gerenciamento de bytes de baixo nível através das funções pack() e unpack(). A função pack() cria bytes puros a partir de números ou strings, enquanto a unpack() reverte o processo.

Principais Lições Aprendidas

  • A Precisão é Crucial: Ao contrário das operações de string multibyte padrão (funções mb_), a manipulação binária exige a leitura de blocos específicos de bytes. Por exemplo, um inteiro de 64 bits sem sinal requer exatamente 8 bytes.
  • Problemas de Compatibilidade com JSON: As funções padrão json_encode() e json_decode() não lidam bem com bytes não-UTF8. Para enviar dados binários entre cliente e servidor via JSON, os campos devem ser codificados em Base64.
  • Estruturas Planas são Melhores: Manter uma lista plana de elementos (textos, tags, listas) junto com uma árvore simples de offsets é frequentemente mais eficiente do que uma estrutura profundamente aninhada. Isso permite buscas rápidas sem a necessidade de parsing completo.

Desempenho: JSON vs. BLOB

Os resultados de benchmarking com 10.000 iterações foram consistentes. O novo formato binário mostrou-se significativamente mais rápido tanto na codificação quanto na decodificação:

  • Codificação JSON Antiga: ~2,18s vs. Nova Codificação Binária: ~1,19s
  • Decodificação JSON Antiga: ~0,86s vs. Nova Decodificação Binária: ~0,67s

Embora o formato binário seja aproximadamente o dobro do tamanho do JSON, os ganhos de desempenho na manipulação de dados — como limpeza de HTML ou extração de texto puro — tornam-no uma escolha superior para arquiteturas de longo prazo.

Conteúdo adaptado do post original de Tom J.