𝗥𝗲𝗲𝗺𝗽𝗹𝗮𝗰𝗲́ 𝗝𝗦𝗢𝗡 𝗰𝗼𝗻 𝘂𝗻 𝗳𝗼𝗿𝗺𝗮𝘁𝗼 𝗯𝗶𝗻𝗮𝗿𝗶𝗼 𝗽𝗲𝗿𝘀𝗼𝗻𝗮𝗹𝗶𝘇𝗮𝗱𝗼 𝗲𝗻 𝗣𝗛𝗣

Necesitábamos una mejor forma de almacenar texto enriquecido para nuestras aplicaciones y sitios web.

Al principio, almacenábamos HTML sin procesar en nuestra base de datos. Más tarde, cambiamos a JSON para separar la edición de la impresión. JSON funcionó durante un tiempo, pero creó nuevos problemas a medida que crecíamos.

JSON se volvió demasiado lento para nuestras necesidades.

Cuando necesitábamos buscar y actualizar enlaces antiguos, teníamos que analizar y reconstruir arrays enteros. Este proceso era lento e ineficiente. Necesitábamos un formato que permitiera una manipulación de datos y un streaming más rápidos.

Decidí construir un formato binario personalizado usando PHP.

Muchos desarrolladores piensan que PHP no está diseñado para la gestión de bytes a bajo nivel. Sin embargo, PHP tiene funciones integradas para esto:

  • pack(): Convierte números o cadenas en bytes sin procesar.
  • unpack(): Convierte esos bytes de nuevo en números o cadenas.

Dejé de usar operaciones de cadenas multibyte. En su lugar, me enfoqué en leer fragmentos específicos de bytes. Por ejemplo, un entero de 64 bits sin signo requiere exactamente 8 bytes. La precisión es clave cuando se trabaja con datos binarios.

También cambié la forma en que estructuraba los datos.

La mayoría de la gente intenta mantener los documentos en una estructura de árbol profunda y anidada. Esto suele ser un error. Cambié a una lista plana de elementos como texto, etiquetas y listas. Utilizo un árbol simple de desplazamientos (offsets) para reconstruir el HTML. Esto hace que tareas como encontrar todos los enlaces o limpiar el HTML sean muy rápidas.

Los resultados de 10,000 iteraciones muestran un claro ganador:

Codificación JSON antigua: 2.18s Decodificación JSON antigua: 0.86s

Nueva codificación binaria: 1.19s Nueva decodificación binaria: 0.67s

El nuevo formato es más rápido tanto para codificar como para decodificar.

El formato binario es más grande que JSON o HTML. Ocupa aproximadamente el doble de espacio que JSON. Dado que utilizamos renderizado en el lado del servidor, este aumento de almacenamiento no afecta nuestro rendimiento.

La compensación vale la pena. Ahora podemos cambiar enlaces y limpiar el HTML con funciones simples y rápidas.

Si construyes un formato personalizado, escribe una especificación clara. La necesitarás cuando vuelvas al código más adelante.

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