إن Garbage Collector (GC) هو نظام إدارة الذاكرة الداخلية في PHP، ولكن هناك بعض التفاصيل الدقيقة التي يجب فهمها.
يقوم GC بأتمتة إدارة الذاكرة، مما يزيل متاعب التعامل مع الذاكرة بالمهام اليدوية (والتي قد تكون مملة).
يسمح هذا للمطورين بالتركيز على منطق أعمالهم دون القلق بشكل مفرط بشأن أخطاء "نفاد الذاكرة".
بالطبع، هذا ليس سحرًا.
يمنع تحرير الكائنات التي لم تعد هناك حاجة إليها تسرب الذاكرة.
يستخدم 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 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
بالنسبة لمعظم الاستخدامات، لا داعي للقلق بشأن إدارة الذاكرة، حيث أن PHP تتعامل معها بالفعل.
ومع ذلك، نظرًا لأن الأكوام الحديثة تستخدم كائنات طويلة العمر، فأنت بحاجة إلى مراقبة التطبيق الخاص بك بحثًا عن أي تسرب محتمل للذاكرة.
إذا واجهت مشكلات، فقد يتعين عليك تحسين الكود و/أو التفاعل مع GC مباشرة.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3