JSON أو serialize: أيهما تختار لتخزين مصفوفات PHP؟

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

JSON أم serialize: السؤال الأبدي لمطور PHP

\n\n

تخيل: أنت تكتب سكريبت PHP يجب أن يحفظ مصفوفة معقدة تحتوي على إعدادات المستخدم. يتبادر إلى ذهنك خياران فوراً: json_encode() و serialize(). أيهما تختار؟ هذا السؤال يحير آلاف المطورين على Stack Overflow، واليوم سنحسم الأمر نهائياً ونعرف أي طريقة هي الأفضل حقاً.

\n\n

سأعرض لكم ليس فقط مقارنات جافة، بل أمثلة حقيقية للكود، واختبارات أداء، والمزالق الخفية التي لا تذكرها الوثائق. هيا بنا!

\n\n

ما المشترك بين json_encode و serialize؟

\n\n

كلتا الدالتين تحولان هياكل البيانات المعقدة (المصفوفات، الكائنات) إلى سلسلة نصية يمكن حفظها في ملف، قاعدة بيانات، أو ذاكرة تخزين مؤقت. لكنهما تفعلان ذلك بطرق مختلفة.

\n\n
    \n
  • json_encode — يحول البيانات إلى تنسيق JSON القياسي (نص مفهوم بواسطة JavaScript ومعظم اللغات).
  • \n
  • serialize — ينشئ تنسيق PHP داخلياً يحتوي على معلومات حول أنواع البيانات ويمكنه استعادة الكائنات مع الحفاظ على الفئات.
  • \n
\n\n

مثال بسيط للكود

\n\n
<?php\n$array = [\n    'name' => 'إيفان',\n    'age' => 30,\n    'skills' => ['PHP', 'JavaScript', 'Python']\n];\n\n// JSON\n$json = json_encode($array, JSON_UNESCAPED_UNICODE);\necho $json; // {"name":"إيفان","age":30,"skills":["PHP","JavaScript","Python"]}\n\n// Serialize\n$serialized = serialize($array);\necho $serialized; // a:3:{s:4:"name";s:10:"إيفان";s:3:"age";i:30;s:6:"skills";a:3:{i:0;s:3:"PHP";i:1;s:10:"JavaScript";i:2;s:6:"Python";}}\n?>
\n\n

الفرق واضح فوراً: JSON أكثر إحكاماً وقابلية للقراءة، بينما serialize أكثر إسهاباً ولكنه يحتوي على بيانات وصفية أكثر.

\n\n

مقارنة حسب المعايير الرئيسية

\n\n

دعنا ننظم كل شيء. لقد أجريت اختبارات وجمعت بيانات ستساعدك على اتخاذ القرار.

\n\n

1. الأداء: من الأسرع؟

\n\n

يعتقد الكثيرون أن serialize يعمل بشكل أسرع لأنه تنسيق PHP "الأصلي". لكن الواقع أكثر تعقيداً.

\n\n
<?php\n$largeArray = [];\nfor ($i = 0; $i < 10000; $i++) {\n    $largeArray[] = [\n        'id' => $i,\n        'name' => 'User_' . $i,\n        'data' => range(1, 50)\n    ];\n}\n\n// اختبار json_encode\n$start = microtime(true);\n$json = json_encode($largeArray);\n$jsonTime = microtime(true) - $start;\n\n// اختبار serialize\n$start = microtime(true);\n$serialized = serialize($largeArray);  \n$serializeTime = microtime(true) - $start;\n\necho "JSON: {$jsonTime} ثانية\\n";\necho "Serialize: {$serializeTime} ثانية\\n";\n// النتيجة: JSON غالباً أسرع بنسبة 10-30%\n?>
\n\n

الاستنتاج: json_encode عادةً أسرع، خاصةً مع المصفوفات الكبيرة. السبب هو أن JSON يستخدم خوارزمية أبسط دون حفظ معلومات عن الفئات.

\n\n

2. حجم البيانات: من الأكثر إحكاماً؟

\n\n

JSON يفوز دائماً تقريباً من حيث الحجم. قارن بنفسك:

\n\n
    \n
  • JSON: {"name":"إيفان","age":30} — 26 بايت
  • \n
  • Serialize: a:2:{s:4:"name";s:10:"إيفان";s:3:"age";i:30;} — 41 بايت
  • \n
\n\n

الفرق من 1.5 إلى 2 مرات لصالح JSON. إذا كنت تخزن غيغابايت من البيانات في ذاكرة التخزين المؤقت، فهذا أمر بالغ الأهمية.

\n\n

3. الأمان: التهديد الخفي لـ serialize

\n\n

هنا يقع الكثيرون في الفخ. unserialize() يمكنه تنفيذ كود عشوائي إذا تم تمرير بيانات مزيفة إليه. وهذا يسمى حقن كائن PHP.

\n\n
<?php\n// مثال خطير\n$userInput = $_GET['data']; // يمكن للمستخدم تمرير سلسلة ضارة\n$object = unserialize($userInput); // خطر! قد ينشئ كائنًا بكود خطير\n\n// البديل الآمن\n$jsonData = json_decode($userInput, true); // مجرد مصفوفة، لا كائنات\n?>
\n\n

هام: لا تستخدم أبداً unserialize() مع بيانات من المستخدم. JSON آمن تماماً في هذا الجانب.

المدونات

توصيات الكتب