నేను PHPలో JSON స్థానంలో ఒక కస్టమ్ బైనరీ ఫార్మాట్ను ఉపయోగించాను
మా యాప్లు మరియు వెబ్సైట్ల కోసం రిచ్ టెక్స్ట్ను (rich text) నిల్వ చేయడానికి మాకు మెరుగైన మార్గం అవసరమైంది.
మొదట, మేము మా డేటాబేస్లో రా (raw) HTMLని నిల్వ చేసేవాళ్లం. ఆ తర్వాత, ఎడిటింగ్ను ప్రింటింగ్ నుండి వేరు చేయడానికి మేము JSONకి మారాము. JSON కొంతకాలం పాటు బాగానే పనిచేసింది, కానీ మేము అభివృద్ధి చెందుతున్న కొద్దీ అది కొత్త సమస్యలను సృష్టించింది.
మా అవసరాలకు JSON చాలా నెమ్మదిగా మారింది.
పాత లింక్లను వెతకడానికి మరియు అప్డేట్ చేయడానికి మాకు అవసరమైనప్పుడు, మేము మొత్తం అర్రేలను (arrays) పార్స్ చేసి మళ్ళీ నిర్మించాల్సి వచ్చేది. ఈ ప్రక్రియ నెమ్మదిగా మరియు అసమర్థంగా ఉండేది. డేటా మానిప్యులేషన్ మరియు స్ట్రీమింగ్ వేగంగా సాగేలా చేసే ఫార్మాట్ మాకు అవసరమైంది.
PHPని ఉపయోగించి ఒక కస్టమ్ బైనరీ ఫార్మాట్ను రూపొందించాలని నేను నిర్ణయించుకున్నాను.
చాలా మంది డెవలపర్లు PHP అనేది లో-లెవల్ బైట్ మేనేజ్మెంట్ (low-level byte management) కోసం తయారు చేయబడలేదని అనుకుంటారు. అయితే, దీని కోసం PHPలో ఇన్-బిల్ట్ ఫంక్షన్లు ఉన్నాయి:
pack(): సంఖ్యలను లేదా స్ట్రింగ్లను రా (raw) బైట్స్గా మారుస్తుంది.unpack(): ఆ బైట్స్ను తిరిగి సంఖ్యలు లేదా స్ట్రింగ్లుగా మారుస్తుంది.
నేను మల్టీబైట్ స్ట్రింగ్ ఆపరేషన్లను ఉపయోగించడం ఆపివేశాను. దానికి బదులుగా, నిర్దిష్ట బైట్ చంక్స్ను (chunks of bytes) చదవడంపై దృష్టి పెట్టాను. ఉదాహరణకు, ఒక అన్సైన్డ్ 64-బిట్ ఇంటిజర్ (unsigned 64-bit integer) కు ఖచ్చితంగా 8 బైట్లు అవసరం. బైనరీ డేటాతో పనిచేసేటప్పుడు ఖచ్చితత్వం (precision) చాలా ముఖ్యం.
నేను డేటాను స్ట్రక్చర్ చేసే విధానాన్ని కూడా మార్చాను.
చాలా మంది డాక్యుమెంట్లను లోతైన, నెస్టెడ్ ట్రీ స్ట్రక్చర్లో (nested tree structure) ఉంచడానికి ప్రయత్నిస్తారు. ఇది తరచుగా ఒక తప్పు. నేను టెక్స్ట్, ట్యాగ్లు మరియు లిస్ట్ల వంటి ఎలిమెంట్స్ యొక్క ఫ్లాట్ లిస్ట్ (flat list) కు మారాను. HTMLని తిరిగి నిర్మించడానికి నేను ఒక సింపుల్ ఆఫ్సెట్ ట్రీని (tree of offsets) ఉపయోగిస్తాను. దీనివల్ల అన్ని లింక్లను కనుగొనడం లేదా HTMLని తొలగించడం (stripping HTML) వంటి పనులు చాలా వేగంగా జరుగుతాయి.
10,000 లూప్ల ఫలితాలు స్పష్టమైన విజేతను చూపుతున్నాయి:
పాత JSON ఎన్కోడింగ్: 2.18s పాత JSON డీకోడింగ్: 0.86s
కొత్త బైనరీ ఎన్కోడింగ్: 1.19s కొత్త బైనరీ డీకోడింగ్: 0.67s
కొత్త ఫార్మాట్ ఎన్కోడింగ్ మరియు డీకోడింగ్ రెండింటికీ వేగంగా ఉంటుంది.
బైనరీ ఫార్మాట్ JSON లేదా HTML కంటే పెద్దదిగా ఉంటుంది. ఇది JSON కంటే దాదాపు రెట్టింపు స్థలాన్ని తీసుకుంటుంది. మేము సర్వర్-సైడ్ రెండరింగ్ (server-side rendering) ఉపయోగిస్తున్నందున, ఈ స్టోరేజ్ పెరుగుదల మా పనితీరుపై ప్రభావం చూపదు.
ఈ లాభనష్టాల సమతుల్యత (trade-off) విలువైనదే. ఇప్పుడు మేము సరళమైన, వేగవంతమైన ఫంక్షన్లతో లింక్లను మార్చవచ్చు మరియు HTMLని క్లీన్ చేయవచ్చు.
మీరు ఒక కస్టమ్ ఫార్మాట్ను రూపొందిస్తే, స్పష్టమైన స్పెసిఫికేషన్ను (specification) వ్రాయండి. మీరు తర్వాత కోడ్ను మళ్ళీ చూసినప్పుడు అది మీకు అవసరమవుతుంది.
మూలం: https://dev.to/tomj/i-replaced-json-with-a-custom-binary-format-in-php-mok