تسبب في تعطل PHP
-
25-09-2019 - |
سؤال
كيف يمكن أن تسبب 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