Reemplacé JSON con un formato binario personalizado en PHP

Necesitamos almacenar texto enriquecido para aplicaciones web y móviles.

Durante años, utilizamos HTML puro en nuestra base de datos. Más tarde, cambiamos a JSON para separar la edición de la impresión.

JSON se convirtió en un problema a medida que nuestros datos crecieron. Para cambiar un solo enlace, teníamos que analizar, reconstruir y convertir en cadena todo el array. Este proceso era lento e ineficiente.

Decidí construir un formato binario personalizado usando PHP.

Aquí te explico por qué hice el cambio:

  • Velocidad: El análisis y la búsqueda se volvieron mucho más rápidos.
  • Control: Puedo manipular bytes específicos sin cargar todo en la memoria.
  • Estructura: Pasé de un árbol anidado a una lista plana de elementos.

La mayoría de las tareas de texto enriquecido no necesitan un árbol complejo. A menudo, solo necesitas encontrar texto o etiquetas específicas. Una estructura plana de elementos con un árbol simple de desplazamientos (offsets) funciona mejor.

PHP no es un lenguaje de bajo nivel. No está optimizado para la manipulación de bytes como Zig o C. Sin embargo, PHP tiene las herramientas adecuadas:

  • pack() convierte números o cadenas en bytes brutos.
  • unpack() convierte esos bytes de nuevo en datos utilizables.

Dejé de usar funciones de cadenas multibyte. En su lugar, leo fragmentos específicos de bytes. Por ejemplo, un entero de 64 bits sin signo requiere exactamente 8 bytes.

Los resultados tras 10,000 iteraciones:

Codificación JSON antigua: 2.18s Decodificación JSON antigua: 0.86s Codificación binaria nueva: 1.19s Decodificación binaria nueva: 0.67s

El formato binario es más rápido. También es más grande. Tiene el doble de tamaño que JSON y el triple que HTML. Dado que utilizamos renderizado en el lado del servidor (server-side rendering), esto no nos importa.

Si construyes un formato personalizado, sigue una regla: escribe una especificación. Documenta tu formato claramente. Te arrepentirás si no lo haces.

Tomó una semana de trabajo. Valió la pena.

Fuente: https://dev.to/tomj/i-replaced-json-with-a-custom-binary-format-in-php-mok