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()ejson_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.