خیلی وقتها موقع کار با PHP یا وردپرس به ارور رفع خطای Allowed memory size exhausted برخورد میکنیم و اولش ممکن است حس کنیم همهچیز بههمریخته. وقتی این خطا ظاهر میشود یعنی اسکریپت ما از حد مجاز حافظهای که PHP برایش در نظر گرفته بیشتر استفاده کرده و به همین دلیل اجرای کد متوقف میشود. اما نگران نباشید؛ با چند راهکار ساده و بهینهسازی کد میتوانید بهراحتی از شر مشکل رفع خطای Allowed memory size exhausted خلاص شوید.
در این مقاله از سایت رامون طالع قدمبهقدم با دلایل این خطا آشنا میشویم، یاد میگیریم چگونه مقدار حافظه فعلی را بررسی کنیم، انواع روشهای افزایش حافظه را مرور میکنیم، تکنیکهای بهینهسازی کد را بررسی میکنیم و در نهایت به طور عملی نحوه رفع خطای Allowed memory size exhausted در وردپرس را توضیح میدهیم.
عنوان های این مقاله
دلایل اصلی بروز ارور

وقتی کد ما در حلقههایی قرار میگیرد که تعداد تکرار آنها مشخص نیست یا بسیار بزرگ است، PHP برای مدیریت دادهها حافظه زیادی مصرف میکند و در نهایت با مشکل رفع خطای Allowed memory size exhausted مواجه میشویم. علاوه بر این، پردازش یک فایل CSV یا XML حجیم به صورت یکجا باعث میشود PHP تمام دادهها را در حافظه بارگذاری کند و در نتیجه حافظه مجاز پر شود.
اگر همزمان چند تصویر یا ویدیو را آپلود یا پردازش کنید، هر فایل به مقدار قابلتوجهی حافظه نیاز دارد و احتمال خطای رفع خطای Allowed memory size exhausted بالا میرود. در پایگاه داده، اجرای کوئریهای بدون محدودیت (LIMIT
) سبب میشود همه رکوردها به یکباره فراخوانی شوند و PHP مجبور شود همه آنها را در حافظه نگه دارد که باز هم منجر به رفع خطای Allowed memory size exhausted میشود. در سیستمهای مدیریت محتوا مثل وردپرس یا جوملا نیز استفاده از پلاگینها و قالبهای بهینهنشده میتواند مصرف حافظه را به شکلی غیرضروری افزایش دهد و باعث شود بارها با ارور رفع خطای Allowed memory size exhausted روبهرو شوید.
بررسی مقدار حافظه فعلی
قبل از اینکه بخواهیم به رفع خطای Allowed memory size exhausted بپردازیم، باید بدانیم PHP چه مقدار حافظه در اختیارمان گذاشته است. برای این کار کافی است یک فایل PHP ایجاد کنیم و کد زیر را در آن قرار دهیم. با اجرای این کد، مقدار memory_limit
نمایش داده میشود و میتوانید ببینید دقیقاً چند مگابایت حافظه برای اجرای اسکریپتها در نظر گرفته شده است. وقتی مقدار فعلی حافظه را بدانید، بهتر میتوانید تصمیم بگیرید که آیا نیاز به افزایش آن دارید یا بهتر است با بهینهسازی کد مشکل رفع خطای Allowed memory size exhausted را حل کنید.
<?php
echo ini_get('memory_limit');
روشهای افزایش حافظه
برای رفع خطای Allowed memory size exhausted راههای مختلفی وجود دارد که بسته به دسترسی شما به سرور یا هاست میتوانید یکی را انتخاب کنید. اگر به فایل php.ini
دسترسی دارید، میتوانید مقدار memory_limit
را بهطور مستقیم افزایش دهید و سپس وبسرور را ریستارت کنید تا تغییرات اعمال شود. در هاستهای اشتراکی که دسترسی به php.ini محدود است، میتوانید با افزودن دستور php_value memory_limit 512M
به فایل .htaccess
حافظه را بالا ببرید؛ البته در برخی هاستها این روش ممکن است پشتیبانی نشود.

روش دیگر استفاده از تابع ini_set
در ابتدای اسکریپت PHP است که تنها برای همان اسکریپت مقدار حافظه را افزایش میدهد. در نهایت اگر هاست شما کنترلپنلهایی مثل cPanel یا DirectAdmin دارد، اغلب گزینهای برای تنظیم memory_limit
به صورت گرافیکی وجود دارد که کار را ساده میکند. با این روشها میتوانید بهراحتی مشکل رفع خطای Allowed memory size exhausted را حل کنید.
; در php.ini
memory_limit = 512M
# در .htaccess
php_value memory_limit 512M
<?php
ini_set('memory_limit', '512M');
بهینهسازی کد برای جلوگیری از مصرف بالا
افزایش حافظه همیشه بهترین راه نیست و گاهی چه بسا مشکلات بیشتری ایجاد کند؛ بنابراین بهتر است قبل از هر چیز کدهایمان را بهینه کنیم تا از نیاز به افزایش بیرویه حافظه جلوگیری شود. یکی از روشها این است که دادههای حجیم را با صفحهبندی (pagination) دریافت کنیم تا همه رکوردها یکجا لود نشوند و PHP مجبور به مصرف زیاد حافظه نباشد. همچنین بعد از اتمام کار با آرایهها یا متغیرهای بزرگ، با استفاده از تابع unset()
آنها را آزاد کنیم تا حافظه بازگردد.
در کوئریهای دیتابیس همیشه از LIMIT
استفاده کنیم تا تعداد رکوردهای بازگشتی محدود باشد. علاوه بر این، حذف کتابخانههای اضافی یا پلاگینهای استفادهنشده و بهروزرسانی المانهای پروژه به نسخههای جدیدتر میتواند مصرف حافظه را کاهش دهد و از بروز مکرر خطای رفع خطای Allowed memory size exhausted پیشگیری کند.
مثال عملی در وردپرس
در وردپرس برای رفع خطای Allowed memory size exhausted لازم نیست مراحل پیچیدهای انجام دهید، کافی است فایل wp-config.php
را باز کنید و با تعریف مقدار جدید حافظه، مشکل را برطرف کنید. معمولاً افزودن خط زیر در ابتدای این فایل کفایت میکند و وردپرس با حافظه بیشتری اجرا میشود. اگر بعد از تنظیم روی ۲۵۶M هنوز با ارور رفع خطای Allowed memory size exhausted مواجه بودید، مقدار را تا ۵۱۲M افزایش دهید و مجدداً تست کنید. همچنین بررسی کنید افزونههای پرمصرف یا قالبهای سنگین غیرفعال باشند تا از مصرف بیرویه حافظه جلوگیری شود و بتوانید بدون مشکل از سایت خود استفاده کنید.
define('WP_MEMORY_LIMIT', '256M');
استفاده از ابزارهای مانیتورینگ و پروفایلینگ

برای اینکه دقیقتر متوجه شویم کد ما در کدام بخشها بیشترین حافظه را مصرف میکند و چگونه میتوانیم رفع خطای Allowed memory size exhausted را به صورت اصولی پیاده کنیم، توصیه میشود از ابزارهای مانیتورینگ مصرف حافظه و پروفایلینگ استفاده کنیم. ابزارهایی مثل Xdebug یا Blackfire به شما اجازه میدهند اجرای اسکریپت را خطبهخط بررسی کنید، میزان حافظه مصرفی هر تابع یا بلوک کد را ببینید و نقاط پرمصرف را شناسایی کنید.
وقتی بدانید دقیقاً کجا حافظه هدر میرود، میتوانید آن بخشها را بازنویسی یا بهینهسازی کنید و صرفاً به افزایش حافظه اکتفا نکنید. این روش کمک میکند همیشه کنترل بیشتری روی مصرف حافظه داشته باشید و دیگر نیازی به رفع خطای Allowed memory size exhausted به صورت مکرر نداشته باشید.
تست و بازبینی نهایی قبل از انتشار
بعد از اینکه تغییرات لازم برای رفع خطای Allowed memory size exhausted را اعمال کردید، باید حتماً تمام بخشهای پروژه را تست کنید. ابتدا اسکریپتها یا صفحات مهم را یک به یک بارگذاری کنید و مصرف حافظه را اندازه بگیرید. اگر از مرورگر یا ابزارهای خط فرمان برای مانیتورینگ استفاده میکنید، حتماً معیارهایی مثل حداکثر حافظه مصرفی و زمان اجرا را ثبت کنید. سپس در شرایط مختلف مثلاً با دادههای کم، متوسط و زیاد تست مجدد انجام دهید تا مطمئن شوید تغییراتتان در همه حالات موثر بوده است.
در نهایت، قبل از انتشار نهایی، یک استیج (staging) یا محیط آزمایشی جداگانه داشته باشید تا بدون خطر ایجاد مشکل روی سایت اصلی، از رفع خطای Allowed memory size exhausted اطمینان حاصل کنید.
نتیجهگیری
رفع خطای Allowed memory size exhausted اگرچه ممکن است در ابتدا گیجکننده باشد، اما با درک دلایل بروز خطا، بررسی مقدار حافظه فعلی و بهکارگیری روشهای افزایش حافظه یا بهینهسازی کد، میتوانیم آن را بهراحتی برطرف کنیم. مهمترین نکته این است که همیشه اول سعی کنیم با بهینهسازی مصرف حافظه مشکل را حل کنیم و تنها در مواقع ضروری حافظه اختصاصیافته را افزایش دهیم. بدین ترتیب هم سرعت و پایداری اپلیکیشنمان افزایش مییابد و هم از بروز خطاهای مشابه در آینده جلوگیری میکنیم. موفق باشید!
سوالات متداول
خطای Allowed Memory Size Exhausted دقیقاً به چه معناست؟
این خطا زمانی ظاهر میشود که اسکریپت PHP شما بیش از مقدار مجاز حافظهای که در تنظیمات memory_limit
مشخص شده استفاده کرده باشد. وقتی این اتفاق میافتد، PHP اجرای کد را متوقف میکند تا از مصرف بیشازحد منابع جلوگیری شود.

چطور میتونم مقدار حافظه مجاز در PHP رو ببینم؟
برای این کار، میتونید از دستور زیر در یک فایل PHP استفاده کنید:
phpCopyEdit<?php echo ini_get('memory_limit');
با اجرای این کد، مقدار فعلی memory_limit
(مثلاً ۱۲۸M یا ۲۵۶M) نمایش داده میشود.
بهترین روش برای افزایش حافظه در وردپرس چیه؟
سادهترین روش، اضافه کردن خط زیر به فایل wp-config.php
است:
phpCopyEditdefine('WP_MEMORY_LIMIT', '256M');
اگر نیاز به حافظه بیشتر داشتید، عدد را میتوانید تا ۵۱۲M یا حتی بیشتر افزایش دهید، البته به شرطی که هاست شما اجازه دهد.
افزایش حافظه همیشه بهترین راهحل هست؟
خیر. بهتره ابتدا کد یا افزونههای سایت را بهینه کنید. استفاده از صفحهبندی، حذف متغیرهای بلااستفاده با unset()
و محدود کردن کوئریهای پایگاهداده از جمله راههای کاهش مصرف حافظه هستند. افزایش حافظه باید آخرین راهحل باشد.
از چه ابزارهایی میتونم برای شناسایی مصرف زیاد حافظه در کد استفاده کنم؟
ابزارهایی مثل Xdebug و Blackfire به شما کمک میکنند کد را پروفایل کنید، مصرف حافظهی هر تابع یا بلوک کد را ببینید و قسمتهای پرمصرف را بهراحتی شناسایی کنید.