سؤال

كيف يمكن أن تسبب PHP تسريبات الذاكرة ، وفيضان المخزن المؤقت ، والفيضان المكدس وأي أخطاء أخرى من هذا النوع؟ هل يمكن أن يسبب PHP مثل هذه الأخطاء؟

هل كانت مفيدة؟

المحلول

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

على سبيل المثال ، يجب أن يتسبب الملف الذي يتطلب نفسه بشكل متكرر في تدفق مكدس:

require __FILE__;  

أو عودة في السحر __sleep() الطريقة التي من المفترض أن تضعف كائن ، ولكن المكالمات serialize() في حين أن:

class sleepCrasher
{
    public function __sleep()
    {
        serialize($this);
    }
}

serialize(new sleepCrasher());

أو أ المدمرة الطبقة هذا يخلق مثيلات جديدة:

class destructorCrasher
{
    public function __destruct()
    {
        new destructorCrasher();
    }
}

// Calling __destruct() manually is just for the sake of example, 
// In real scenarios, PHP's garbage collector will crash PHP for you.
(new destructorCrasher())->__destruct();

وكذلك العودية __toString():

class toStringCrasher
{
    public function __tostring()
    {
        return strval($this);
    }
}

strval(new toStringCrasher());

هناك سيناريوهات عودية أخرى محمية PHP. على سبيل المثال ، استدعاء وظيفة متكررة بدون حالة خروج أو مولد العائد الذاتي العودية. هؤلاء لا يتسببون في حدوث حادث ، ولكن أ Allowed memory size of ... خطأ مميت.

لمزيد من الأمثلة ، قد ترغب في رؤية:

نصائح أخرى

يمكنك إما القيام بالأشياء التي من شأنها أن تتسبب في تدفقات في أي لغة (مثل استدعاء الوظيفة الحالية بشكل متكرر ، أو تناول الذاكرة بلا رحمة ، وما إلى ذلك) أو الاعتماد على مترجم PHP القديم الجيد للقيام بهذه المهمة. فقط ألق نظرة على كم عدد تسريبات الذاكرة التي تم إصلاحها في PHP5 (المفضل لدي: في 5.2.6 تم إصلاحهم علة #44069: 'استخدام ذاكرة ضخمة مع تسلسل باستخدام . بدلاً من .=').

الكل في الكل PHP هو موافق (على الأكثر) إذا كنت تريد فقط تقديم طلب HTTP واحد. لكن لا يمكنك فعل أشياء متطورة معها (حاولت ذات مرة تنفيذ عميل Peer2Peer ، توفي الخادم بسبب نقص الذاكرة بعد 10 دقائق فقط - يمكن أن يكون خطأً نيابة عني بالطبع ، لكنني قضيت عدة أيام في العثور على التسريبات في الكود الخاص بي - ولكن دون جدوى).

PHP هي لغة تفسير ، لذلك يتم حماية جميع البرامج النصية لـ PHP من تسرب الذاكرة ، وتفوق المخزن المؤقت وتفوق المكدس.

كيف ستواجه مشاكل على هذا النحو:

فائض عدد صحيح ، إذا قمت بتعيين رقم كبير جدًا ، فسيتم تجاوزه ، ولن يحدث أي استثناء.

خارج الذاكرة ، باستخدام ذاكرة أكثر من حجم الذاكرة الذي تم تكوينه في php.ini

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top