Ho sostituito JSON con un formato binario personalizzato in PHP

Abbiamo bisogno di memorizzare testo formattato (rich text) per app web e mobile.

Per anni abbiamo utilizzato HTML puro nel nostro database. Successivamente, siamo passati a JSON per separare la fase di editing da quella di stampa.

JSON è diventato un problema con la crescita dei dati. Per modificare un singolo link, dovevamo analizzare (parse), ricostruire e convertire in stringa l'intero array. Questo processo era lento e inefficiente.

Ho deciso di creare un formato binario personalizzato utilizzando PHP.

Ecco perché ho effettuato il passaggio:

  • Velocità: il parsing e la ricerca sono diventati molto più veloci.
  • Controllo: posso manipolare byte specifici senza caricare tutto in memoria.
  • Struttura: sono passato da un albero annidato a una lista piatta di elementi.

La maggior parte delle operazioni sul testo formattato non richiede un albero complesso. Spesso è sufficiente trovare del testo o dei tag specifici. Una struttura piatta di elementi con un semplice albero di offset funziona meglio.

PHP non è un linguaggio di basso livello. Non è ottimizzato per la manipolazione dei byte come Zig o C. Tuttavia, PHP ha gli strumenti giusti:

  • pack() trasforma numeri o stringhe in byte grezzi.
  • unpack() trasforma quei byte nuovamente in dati utilizzabili.

Ho smesso di usare le funzioni per stringhe multibyte. Invece, leggo blocchi specifici di byte. Ad esempio, un intero a 64 bit senza segno richiede esattamente 8 byte.

I risultati dopo 10.000 cicli:

Vecchia codifica JSON: 2,18s Vecchia decodifica JSON: 0,86s Nuova codifica binaria: 1,19s Nuova decodifica binaria: 0,67s

Il formato binario è più veloce. È anche più grande. È il doppio di JSON e il triplo di HTML. Poiché utilizziamo il rendering lato server, questo non è un problema per noi.

Se crei un formato personalizzato, segui una regola: scrivi una specifica. Documenta chiaramente il tuo formato. Te ne pentirai se non lo farai.

Ci è voluta una settimana di lavoro. Ne è valsa la pena.

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