Memory Leak چیست و چگونه رخ میدهد؟
تا حالا شده لوله ای تو ساختمون یا هر جای دیگه نشتی پیدا کنه و باعث صدمات ناشی از این اتفاق بشید. یا اینکه چطوری تونستید این اتفاق رو تشخیص بدید یا اگر مثلا لوله ها توکار بودن چطوری تونستید بفهمید که دقیقا کجا و تو کدوم لوله این نشتی وجود داره ؟
memory leak یا نشتی مموری هم یه چیزی مثل نشتی لوله هست و هم استرس داره هم میتونه راه های تشخیص مختلفی داشته باشه و میتونه در هر زبانی اتفاق بیفته و زمانی که یک برنامه نشتی مموری داشته باشه در آینده خیلی نزدیک به مشکل خواهد خورد .
ما memory leak رو تو زبان php بررسی میکنیم و به این میرسیم که این اتفاق چطوری می افته و چطوری میشه ازش پیشگیری کرد و تشخیص داد که یک برنامه نشتی مموری داره .
memory leak چطوری اتفاق می افته ؟
تو پی اچ پی این شرایط زمانی پیش میاد که بخشی از کد شما همچنان داره از مموری استفاده میکنه در صورتی که واقعا برنامه به اون نیازی نداره و یا مثلا قبلا نیاز داشته و استفاده اش انجام شده اما مموری هنوز آزاد نشده .
که چندین حالت میتونه داشته باشه :
- متغییرهایی که هیچ وقت از Scope خارج نمیشن
- circular reference
در مورد این موارد میتونیم در آینده مطلب مجزا بنویسیم
آیا پی اچ پی garbage collection داره ؟
پاسخ بله است ، garbage collection به صورت پیش فرض روی پی اچ پی فعال هست اما میتونید تو php.ini غیر فعالش کنید .
در کل برای برنامه های با عمر انجام کوتاه و برنامه هایی که کامل خارج میشن میتونید این قابلیت رو فعال نکنید تا پرفرمنس بهتری داشته باشید و بعد از انجام کامل برنامه کل مموری استفاده شده آزاد میشه ، اما برای برنامه های با عمر بلند تر بهتره فعال باشه و حتما بهش نیاز خواهید داشت .
چطور میتونیم memory leak رو تشخیص و پیدا کنیم ؟
چند تا راه وجود داره :
- اسکریپتتون رو لاگ کنید : با استفاده از auto_append_file` و `memory_get*
- شناسایی اوج مصرف : میتونید با متود memory_get_peak_usage مقدار پیک مموری اختصاص داده شده به اسکریپت رو نشون میده . این کار رو برای کل اسکریپت انجام میدیم تا ببینیم آیا مصرف مموری غیر نرمال هست یا خیر اگر اینطور بود میتونیم اسکریپت رو بخش بخش کنیم و بخشی که بیشترین مموری رو میگیره و پیدا کنیم .
- از php-memprof extension برای پیدا کردن اینکه بعد از اجرای برنامه همچنان چقدر مموری آزاد نشده داریم میتونیم استفاده کنیم .
همچنین ابزارهایی هم برای مانیتور کردن مصرف مموری وجود داره مثل PHP-memprof و Xdebug , Xhprof که میتونید ازشون استفاده کنید .