تا حالا شده با خطای معروف Allowed memory size exhausted توی PHP یا زبانهای دیگه روبرو بشید؟
همون لحظهای که اسکریپت تصمیم میگیره دیگه جا نداره! امروز میخوام خیلی کوتاه درباره دلیل اصلی این ماجرا، یعنی حافظه Heap صحبت کنم.
وقتی ما کدی مینویسیم، سیستمعامل دو نوع حافظه اصلی در اختیارمون میذاره: Stack و Heap.
استک (Stack): مثل یک دفترچه یادداشت کوچیکه که خیلی سریع و منظم کار میکنه. متغیرهای ساده و موقتیِ داخل توابع (مثل $i توی حلقهها) اونجا میرن و سریع هم پاک میشن.
هیپ (Heap): اما داستان هیپ متفاوته. این همون انبار بزرگ و بینظمیه که برای کارهای سنگین رزرو شده.
چرا Heap برای ما وبدولوپرها (مخصوصا PHP کارها) مهمه؟
هر بار که شما:
۱. یک آبجکت جدید میسازید (new User())
۲. یک آرایه بزرگ از دیتابیس فچ میکنید
۳. یا یک فایل سنگین رو توی متغیر لود میکنید
در واقع دارید از فضای Heap خرج میکنید. برخلاف Stack که خودش تمیزکاری میکنه، مدیریت Heap پیچیدهتره.
در PHP، ما Garbage Collector (GC) داریم که وظیفهاش اینه که دور بزنه و متغیرهایی که دیگه استفاده نمیشن رو از Heap پاک کنه. اما…
اگر ما حواسمون نباشه و رفرنسهای تودرتو یا بیخودی ایجاد کنیم، GC گیج میشه و حافظه آزاد نمیشه! نتیجه؟ پر شدن RAM و کرش کردن اسکریپتهای طولانی (مثل Worker های لاراول یا Cron Job ها).
خلاصه اینکه، هوای Heap رو داشته باشید تا اونم هوای سرورهای شما رو داشته باشه!
@DevTwitter | <Taha Zargar/>