میں نے PHP میں JSON کو ایک کسٹم بائنری فارمیٹ سے بدل دیا
ہمیں اپنی ایپس اور ویب سائٹس کے لیے ریچ ٹیکسٹ (rich text) کو اسٹور کرنے کے لیے ایک بہتر طریقے کی ضرورت تھی۔
شروع میں، ہم اپنے ڈیٹا بیس میں خام HTML اسٹور کرتے تھے۔ بعد میں، ہم نے ایڈیٹنگ کو پرنٹنگ سے الگ کرنے کے لیے JSON کا استعمال شروع کیا۔ JSON کچھ عرصے تک تو ٹھیک رہا، لیکن جیسے جیسے ہمارا کام بڑھا، اس نے نئی مشکلات پیدا کرنا شروع کر دیں۔
JSON ہماری ضروریات کے لیے بہت سست ہو گیا تھا۔
جب ہمیں پرانے لنکس کو تلاش کرنے اور اپ ڈیٹ کرنے کی ضرورت پڑتی، تو ہمیں پورے ایرے (arrays) کو پارس اور دوبارہ بنانا پڑتا تھا۔ یہ عمل سست اور غیر موثر تھا۔ ہمیں ایک ایسے فارمیٹ کی ضرورت تھی جو ڈیٹا کے تیز تر مینیپولیشن (manipulation) اور اسٹریمنگ (streaming) کی اجازت دے سکے۔
میں نے PHP کا استعمال کرتے ہوئے ایک کسٹم بائنری فارمیٹ بنانے کا فیصلہ کیا۔
بہت سے ڈویلپرز کا خیال ہے کہ PHP لو-لیول بائٹ مینجمنٹ (low-level byte management) کے لیے نہیں بنا۔ تاہم، PHP میں اس کے لیے بلٹ ان فنکشنز موجود ہیں:
pack(): نمبروں یا اسٹرنگز کو خام بائٹس (raw bytes) میں تبدیل کرتا ہے۔unpack(): ان بائٹس کو دوبارہ نمبروں یا اسٹرنگز میں تبدیل کرتا ہے۔
میں نے ملٹی بائٹ اسٹرنگ آپریشنز کا استعمال بند کر دیا۔ اس کے بجائے، میں نے بائٹس کے مخصوص ٹکڑوں (chunks) کو پڑھنے پر توجہ دی۔ مثال کے طور پر، ایک unsigned 64-bit integer کو ٹھیک 8 بائٹس کی ضرورت ہوتی ہے۔ بائنری ڈیٹا کے ساتھ کام کرتے وقت درستگی (precision) بہت اہم ہے۔
میں نے ڈیٹا کے ڈھانچے (structure) کو بھی تبدیل کیا۔
زیادہ تر لوگ دستاویزات کو ایک گہرے، نیم نیسٹڈ (nested) ٹری اسٹرکچر میں رکھنے کی کوشش کرتے ہیں۔ یہ اکثر ایک غلطی ہوتی ہے۔ میں نے ٹیکسٹ، ٹیگز اور لسٹوں جیسے عناصر کی ایک فلیٹ لسٹ (flat list) کا انتخاب کیا۔ میں HTML کو دوبارہ بنانے کے لیے آفسیٹس (offsets) کا ایک سادہ ٹری استعمال کرتا ہوں۔ اس سے تمام لنکس تلاش کرنے یا HTML کو ہٹانے جیسے کام بہت تیز ہو جاتے ہیں۔
10,000 لوپس کے نتائج ایک واضح فاتح دکھاتے ہیں:
پرانا JSON Encoding: 2.18s پرانا JSON Decoding: 0.86s
نیا Binary Encoding: 1.19s نیا Binary Decoding: 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