لقد استبدلت JSON بتنسيق ثنائي مخصص في PHP

كنا بحاجة إلى طريقة أفضل لتخزين النصوص الغنية (rich text) لتطبيقاتنا ومواقعنا الإلكترونية.

في البداية، كنا نخزن HTML خام في قاعدة بياناتنا. لاحقاً، انتقلنا إلى JSON لفصل عملية التحرير عن الطباعة. عمل JSON لفترة من الوقت، لكنه تسبب في مشاكل جديدة مع توسع أعمالنا.

أصبح JSON بطيئاً جداً بالنسبة لاحتياجاتنا.

عندما كنا نحتاج إلى البحث عن الروابط القديمة وتحديثها، كان علينا تحليل (parse) وإعادة بناء مصفوفات كاملة. كانت هذه العملية بطيئة وغير فعالة. كنا بحاجة إلى تنسيق يسمح بمعالجة البيانات وتدفقها (streaming) بشكل أسرع.

قررت بناء تنسيق ثنائي (binary format) مخصص باستخدام PHP.

يعتقد الكثير من المطورين أن PHP لم تُصمم لإدارة البايتات (bytes) على مستوى منخفض. ومع ذلك، تحتوي PHP على وظائف مدمجة لهذا الغرض:

  • pack(): تحول الأرقام أو النصوص إلى بايتات خام.
  • unpack(): تحول تلك البايتات مرة أخرى إلى أرقام أو نصوص.

توقفت عن استخدام عمليات النصوص متعددة البايتات (multibyte string operations). بدلاً من ذلك، ركزت على قراءة أجزاء (chunks) محددة من البايتات. على سبيل المثال، يتطلب الرقم الصحيح غير الموقع (unsigned 64-bit integer) 8 بايتات بالضبط. الدقة هي المفتاح عند التعامل مع البيانات الثنائية.

قمت أيضاً بتغيير كيفية هيكلة البيانات.

يحاول معظم الناس الاحتفاظ بالمستندات في هيكل شجري عميق ومتداخل. غالباً ما يكون هذا خطأً. لقد انتقلت إلى قائمة مسطحة من العناصر مثل النصوص، والوسوم (tags)، والقوائم. أستخدم شجرة بسيطة من الإزاحات (offsets) لإعادة بناء HTML. هذا يجعل مهام مثل العثور على جميع الروابط أو إزالة HTML سريعة جداً.

تظهر نتائج 10,000 دورة فائزاً واضحاً:

ترميز JSON القديم: 2.18s فك ترميز JSON القديم: 0.86s

الترميز الثنائي الجديد: 1.19s فك الترميز الثنائي الجديد: 0.67s

التنسيق الجديد أسرع في كل من الترميز وفك الترميز.

التنسيق الث