تسرب الذاكرة في الانتقال من PHP 4 إلى 5 - أي تلميحات؟
-
21-09-2019 - |
سؤال
أقوم بنقل تطبيق ويب كبير إلى بيئة استضافة ويب مشتركة. تم كتابة التطبيق في PHP 4. البيئة الجديدة لديها PHP 5.2.
لسبب ما ، يتسرب التطبيق من كميات هائلة من الذاكرة عند التشغيل في PHP 5.2. يمكنني مراقبة استخدام الذاكرة حرفيًا عبر السقف باستخدام Memory_get_usage () ، حتى يصل إلى حد 64 ميغابايت (وهو سخي للغاية في بيئة مشتركة ، وهو الموقع المستخدم لتشغيله مع 12 أو 16 ميجابايت على PHP 4).
أظن أن هذا مؤثر جانبي لشيء تغير في PHP 5 ، على الأرجح معالجة مراجع الكائن في الحجج. ومع ذلك ، فإن البحث عن السلوك (السلوك) المعين الذي يسبب (ق) تسرب أمر صعب للغاية لأن التطبيق معقد للغاية ، وجزئيًا ليس مكتوبًا جيدًا (نعم ، إنه لي).
نظرًا لأن التطبيق مثبت على مساحة ويب مشتركة ، لا يمكنني استخدام مرافق التصحيح الكلاسيكي (على حد علمي). أرغب كثيرًا في تجنب إعادة إنشاء البيئة محليًا ، حيث أعمل في المشروع حرفيًا طوال اليوم لبعض الوقت.
لذلك أسئلتي هي:
هل يعرف أي شخص PHP4 => 5 مخاطر انتقالية ، خاصة عند التعامل مع كميات كبيرة من الكائنات ، قد يكون هذا هو سبب تسربتي (S)
هل يعرف أي شخص نوعًا من أداة "تفريغ النطاق الرسومي" المستقلة عن تصحيح الأخطاء ، للمتغيرات التي تستخدمها PHP والتي قد تساعدني في معرفة المتغيرات التي تتناول هذه الكميات الهائلة من الذاكرة؟
المحلول
لحل هذه المشكلة أود:
- ملف تعريف البرنامج النصي مع XDebug+Wincachegrind (أو بعض profiler الأخرى) و/أو firephp.
- قم بتشغيل الوضع الصارم للحصول على جميع إشعارات PHP Error +.
القيام بذلك ، ستتمكن من:
- تحسين الرمز الخاص بك. (إزالة الأخطاء/التحذير/الإشعارات يمكن أن تسرع التعليمات البرمجية الخاصة بك)
- تنظيف الكود الخاص بك. (باستخدام بناء جملة كائن PHP5 المناسب يمكن أن يكون جيدًا فقط للأداء).
تم تغيير نموذج الكائن بالكامل من PHP4 إلى PHP5. بالتأكيد ، سيخبرك الوضع الصارم أنه يجب ألا تستخدم "تم تمريره بالرجوع إليه".
نصائح أخرى
واحد شائع وجدته في إصدار واحد من 5.2 هو أن strtotime تسربت دون الذاكرة _usage اصطياده. تغيير إلى Strptime إصلاح القضية.
هناك تقرير خطأ لهذا مقابل 5.2.8 - http://bugs.php.net/bug.php؟id=46889.
بدون تصحيح الأخطاء ، يمكنك فتح البرنامج النصي الذي تعتقد أنه يستخدم العديد من الذاكرة ووضع وظيفة الذاكرة _ usage في السكان المحليين الحرجين.