𝗜 𝘀𝘂𝗯𝘀𝘁𝗶𝘁𝘂𝗶 𝗼 𝗝𝗦𝗢𝗡 𝗽𝗼𝗿 𝘂𝗺 𝗳𝗼𝗿𝗺𝗮𝘁𝗼 𝗯𝗶𝗻𝗮́𝗿𝗶𝗼 𝗽𝗲𝗿𝘀𝗼𝗻𝗮𝗹𝗶𝘇𝗮𝗱𝗼 𝗲𝗺 𝗣𝗛𝗣
Precisamos armazenar texto rico para aplicativos web e móveis.
Durante anos, usamos HTML puro em nosso banco de dados. Mais tarde, mudamos para JSON para separar a edição da impressão.
O JSON tornou-se um problema conforme nossos dados cresciam. Para alterar um único link, tínhamos que fazer o parsing, reconstruir e transformar todo o array em string. Esse processo era lento e ineficiente.
Decidi construir um formato binário personalizado usando PHP.
Aqui está o porquê de eu ter feito a mudança:
- Velocidade: O parsing e a busca tornaram-se muito mais rápidos.
- Controle: Posso manipular bytes específicos sem carregar tudo na memória.
- Estrutura: Mudei de uma árvore aninhada para uma lista plana de elementos.
A maioria das tarefas de texto rico não precisa de uma árvore complexa. Frequentemente, você só precisa encontrar um texto ou tags específicas. Uma estrutura plana de elementos com uma árvore simples de offsets funciona melhor.
O PHP não é uma linguagem de baixo nível. Não é otimizado para manipulação de bytes como o Zig ou o C. No entanto, o PHP possui as ferramentas certas:
pack()transforma números ou strings em bytes brutos.unpack()transforma esses bytes de volta em dados utilizáveis.
Parei de usar funções de string multibyte. Em vez disso, leio blocos específicos de bytes. Por exemplo, um inteiro de 64 bits sem sinal requer exatamente 8 bytes.
Os resultados após 10.000 loops:
Codificação JSON antiga: 2,18s Decodificação JSON antiga: 0,86s Codificação Binária nova: 1,19s Decodificação Binária nova: 0,67s
O formato binário é mais rápido. Ele também é maior. Tem o dobro do tamanho do JSON e o triplo do tamanho do HTML. Como usamos renderização no lado do servidor, isso não importa para nós.
Se você construir um formato personalizado, siga uma regra: escreva uma especificação. Documente seu formato claramente. Você se arrependerá se não o fizer.
Levou uma semana de trabalho. Valeu a pena.
Fonte: https://dev.to/tomj/i-replaced-json-with-a-custom-binary-format-in-php-mok