لقد استبدلت JSON بتنسيق ثنائي مخصص في PHP
نحن بحاجة لتخزين النصوص الغنية (rich text) لتطبيقات الويب والهاتف المحمول.
لسنوات، استخدمنا HTML خالصًا في قاعدة بياناتنا. لاحقًا، انتقلنا إلى JSON لفصل عملية التحرير عن الطباعة.
أصبح JSON مشكلة مع نمو بياناتنا. لتغيير رابط واحد، كان علينا تحليل (parse)، وإعادة بناء، وتحويل المصفوفة بأكملها إلى سلسلة نصية (stringify). كانت هذه العملية بطيئة وغير فعالة.
قررت بناء تنسيق ثنائي مخصص باستخدام PHP.
إليك سبب قيامي بهذا التحول:
- السرعة: أصبح التحليل والبحث أسرع بكثير.
- التحكم: يمكنني التلاعب ببايتات (bytes) محددة دون تحميل كل شيء في الذاكرة.
- الهيكل: انتقلت من شجرة متداخلة إلى قائمة مسطحة من العناصر.
معظم مهام النصوص الغنية لا تحتاج إلى شجرة معقدة. غالبًا ما تحتاج فقط إلى العثور على نص أو وسوم (tags) محددة. الهيكل المسطح للعناصر مع شجرة بسيطة من الإزاحات (offsets) يعمل بشكل أفضل.
لغة PHP ليست لغة منخفضة المستوى (low-level language). فهي ليست محسنة للتلاعب بالبايتات مثل Zig أو C. ومع ذلك، تمتلك PHP الأدوات المناسبة:
pack()تحول الأرقام أو السلاسل النصية إلى بايتات خام.unpack()تحول تلك البايتات مرة أخرى إلى بيانات قابلة للاستخدام.
توقفت عن استخدام وظائف السلاسل النصية متعددة البايتات (multibyte string functions). وبدلاً من ذلك، قمت بقراءة أجزاء محددة من البايتات. على سبيل المثال، يتطلب الرقم الصحيح غير الموقع (unsigned 64-bit integer) 8 بايتات بالضبط.
النتائج بعد 10,000 دورة:
ترميز JSON القديم: 2.18 ثانية فك ترميز JSON القديم: 0.86 ثانية الترميز الثنائي الجديد: 1.19 ثانية فك الترميز الثنائي الجديد: 0.67 ثانية
التنسيق الثنائي أسرع، ولكنه أيضًا أكبر حجمًا؛ فهو ضعف حجم JSON وثلاثة أضعاف حجم HTML. وبما أننا نستخدم العرض من جانب الخادم (server-side rendering)، فإن هذا لا يهمنا.
إذا قمت ببناء تنسيق مخصص، فاتبع قاعدة واحدة: اكتب مواصفات (specification). وثّق تنسيقك بوضوح، وإلا ستندم لاحقًا.
استغرق الأمر أسبوعًا من العمل، لكنه كان يستحق العناء.
المصدر: https://dev.to/tomj/i-replaced-json-with-a-custom-binary-format-in-php-mok