"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > PHP: تم شرح أداة تجميع البيانات المهملة بكلمات بسيطة

PHP: تم شرح أداة تجميع البيانات المهملة بكلمات بسيطة

تم النشر بتاريخ 2024-12-11
تصفح:608

إن Garbage Collector (GC) هو نظام إدارة الذاكرة الداخلية في PHP، ولكن هناك بعض التفاصيل الدقيقة التي يجب فهمها.

؟ لماذا يوجد GC أصلاً؟

يقوم GC بأتمتة إدارة الذاكرة، مما يزيل متاعب التعامل مع الذاكرة بالمهام اليدوية (والتي قد تكون مملة).

يسمح هذا للمطورين بالتركيز على منطق أعمالهم دون القلق بشكل مفرط بشأن أخطاء "نفاد الذاكرة".

بالطبع، هذا ليس سحرًا.

؟ 10000 كائن باختصار

يمنع تحرير الكائنات التي لم تعد هناك حاجة إليها تسرب الذاكرة.

يستخدم GC آلية العد لتحديد العناصر التي سيتم إسقاطها. إذا لم تكن هناك أي مراجع تشير إلى كائن معين (أي $counter = 0)، فإن هذا الكائن مؤهل للتنظيف.

يعمل بشكل جيد، ولكن بعض المراجع يمكن أن تكون مشكلة:

class A {
    public $b;
}

class B {
    public $a;
}

$a = new A();
$b = new B();

$a->b = $b;
$b->a = $a;

unset($a);
unset($b);

في هذه الحالة من التصميم السيئ، لن تقوم PHP بتحرير الذاكرة حتى لو قمنا بإلغاء تعيين $a و$b، حيث يشيران إلى بعضهما البعض، مما يدفع PHP إلى الاعتقاد بأنهما لا يزالان قيد الاستخدام.

لحسن الحظ، هناك آلية أخرى تسمى مُجمع الدورات لذلك:

gc_collect_cycles();

بشكل تقريبي، يجتاز المجمع جميع المراجع ويطبق خوارزمية لوضع علامة على الكائنات المستخدمة، والتي تكشف عن الكائنات المطلوب جمعها (الأشياء غير المميزة).

ومع ذلك، PHP لا يقوم بتشغيل عملية جمع دورة تلقائية حتى يتم الوصول إلى عتبات 10000 كائن مع المراجع الدورية المحتملة.

مرة أخرى، هذا ليس سحرًا، لذا يجب عليك استدعاء gc_collect_cycles() فقط في حالات قليلة.

؟ تانستافل

يمكن أن يؤدي التصميم السيئ إلى علاقات معقدة بين الكائنات، مما يؤدي إلى المزيد من المراجع وجمع البيانات المهملة بشكل متكرر.

يتطلب كل كائن تم إحصاءه كمرجع مساحة تخزين إضافية لعدد المراجع الخاص به.

المصدر: ويكيبيديا - عدد المراجع

يمكن أن يؤثر الحمل المرتبط بعمليات تنظيف الذاكرة على الأداء العالمي بشكل كبير وفي النهاية يزيد من وقت التنفيذ في سيناريوهات محددة.

منذ 10 سنوات، حصل Composer على تعزيز كبير في الأداء بمجرد استخدام الدالة gc_disable().

المصدر: الملحن - تعطيل GC

في الواقع، قام PHP 7 بتحسين GC بشكل كبير، لذلك لم يعد كما كان في عام 2014.

بالإضافة إلى ذلك، قامت إصدارات PHP 8 بتحسين استراتيجيات تخصيص الذاكرة وإضافة المزيد من الإحصائيات المفيدة حول عمليات GC لمراقبة أفضل (gc_status() في الإصدار 8.3).

معظم تطبيقات PHP تعتمد على الطلب، ويتم مسح الذاكرة تلقائيًا في نهاية الطلب.

مرة أخرى، إنه أمر رائع ولكنه ليس سحريًا. ماذا يحدث للطلبات غير المتزامنة والكائنات/الشياطين طويلة العمر؟

قد تواجه تسربًا للذاكرة في مرحلة ما.

؟ ما مدى اختلاف GC الخاص بـ PHP؟

في هذه المرحلة، قد لا ترى كيف يختلف GC الخاص بـ PHP عن اللغات الأخرى.

في معظم الأحيان، لا تعتمد اللغات الأخرى على العد المرجعي لجمع البيانات المهملة أو قد تستخدم تطبيقات مختلفة.

على سبيل المثال، يستخدم الكثيرون خوارزمية التتبع التي تحدد أيضًا الكائنات غير المستخدمة ولكنها لا تعمل بشكل تدريجي. إنه اجتياز الرسم البياني.

إلى جانب ذلك، بعض اللغات لا تسمح بمثل هذا التحكم المباشر (على سبيل المثال، التشغيل/الإيقاف في وقت التشغيل).

كالعادة، هناك بعض المزايا والعيوب، لذلك قد ترى بعض الأساليب المختلطة.

?‍? التفاعل مع PHP's GC

يمكنك الاستفادة من مساعدات gc_* المضمنة.

على سبيل المثال:

  • يقوم gc_collect_cycles بتشغيل مجموعة البيانات المهملة يدويًا
  • gc_status() يعطي الحالة الحالية
  • gc_disable() يعطله
  • gc_enable() يمكّنها

هذه الوظائف مفيدة لتصحيح الأخطاء أو الضبط الدقيق لجمع البيانات المهملة عند الضرورة.

؟ فهم أخطاء الذاكرة

يمكنك قراءة هذا المنشور لمزيد من الأفكار:

PHP: The Garbage Collector explained with simple words

PHP: أخطاء في الذاكرة

spO0q ؟ ・ 24 مايو 23

#php #مبتدئين #برمجة

؟ خرائط ضعيفة للإنقاذ؟

قدم PHP 7.4 مراجع ضعيفة وقدم PHP 8 خرائط ضعيفة.

يمكن وصف الخريطة الضعيفة بأنها مجموعة من المراجع الضعيفة.

بنية البيانات هذه عبارة عن مخزن متعدد الاستخدامات ذو قيمة أساسية يساعد PHP على تتبع العناصر دون خلق فوضى أو استهلاك مساحة زائدة.

قد تراه كمخزن مؤقت سيتم مسحه على الفور عندما لا تكون هناك حاجة إليه، حيث لا يوجد مرجع [قوي] يمكن أن يمنع جمع البيانات المهملة:

$object = new stdClass;
$map = new WeakMap();
$map[$object] = true;
$object->name = 'some name';
print_r($map);// $object is stored in $map

unset($object);

print_r($map);// $object is cleaned and no longer available

✅ الايجابيات

  • مباشرة جدًا
  • رائعة للتخزين المؤقت أو الحفظ (على سبيل المثال، العمليات الحسابية باهظة الثمن)

❌ سلبيات

  • بينما لا تمنع المفاتيح (الكائنات) جمع البيانات المهملة، فإن القيم يمكنها ذلك، لذلك يمكن أن يكون مصطلح "القيم التعسفية" مضللًا (استخدم فقط أنواع البيانات البسيطة كقيم)
  • حالات الاستخدام القيّمة محدودة

؟ تحسين التعليمات البرمجية

  • الاستفادة من أنماط التصميم التي تقلل من الترابط
  • استخدام حقن التبعية
  • لا تقم بتحميل مجموعات بيانات كبيرة جدًا في الذاكرة واستخدم المجموعات والمولدات بدلاً من المصفوفات الضخمة
  • مراقبة استخدام الذاكرة
  • قم بتعريف الكود الخاص بك باستخدام المقاييس
  • استخدم gc_enable() وgc_disable() وgc_collect_cycles() باعتدال

اختتم

بالنسبة لمعظم الاستخدامات، لا داعي للقلق بشأن إدارة الذاكرة، حيث أن PHP تتعامل معها بالفعل.

ومع ذلك، نظرًا لأن الأكوام الحديثة تستخدم كائنات طويلة العمر، فأنت بحاجة إلى مراقبة التطبيق الخاص بك بحثًا عن أي تسرب محتمل للذاكرة.

إذا واجهت مشكلات، فقد يتعين عليك تحسين الكود و/أو التفاعل مع GC مباشرة.

بيان الافراج هذه المقالة مستنسخة على: https://dev.to/spo0q/php-the-garbage-collector-explained-with-simple-words-1b7d?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] للحذف هو - هي
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3