پرش به محتوا
پیکربندی

رفع خطای "Allowed Memory Size Exhausted" در وردپرس

اگر سایت شما پیام Fatal error: Allowed memory size of 268435456 bytes exhausted را نشان می‌دهد، این خط را در wp-config.php بالای / That's all, stop editing! / اضافه کنید.

منتشرشده

اگر سایت شما پیام Fatal error: Allowed memory size of 268435456 bytes exhausted را نشان می‌دهد، این خط را در wp-config.php بالای کامنت /* That's all, stop editing! */ اضافه کنید: define( 'WP_MEMORY_LIMIT', '256M' );. این کار بیشتر سایت‌ها را در کمتر از یک دقیقه دوباره بالا می‌آورد. اما قبل از اینکه از این صفحه بروید، بقیهٔ آن را هم بخوانید، چون بالا بردن محدودیت حافظه یک ابزار تشخیص است، نه یک درمان. اگر خطا با عدد بزرگ‌تری دوباره برگردد، مشکل واقعی کدی است که بدون حد و مرز حافظه مصرف می‌کند، و سقف بزرگ‌تر فقط به آن طناب بیشتری می‌دهد.

این خطا در واقع چه معنایی دارد

PHP رصد می‌کند که هر درخواست چقدر حافظه اختصاص داده است. وقتی یک درخواست تلاش می‌کند از memory_limit تعیین‌شده در php.ini (یا مقداری که وردپرس آن را بازنویسی کرده) فراتر برود، PHP بلافاصله درخواست را با یک خطای مهلک متوقف می‌کند و تعداد بایتی را که در آن نقطه از کار افتاده چاپ می‌کند. 268435456 bytes برابر با 256M است. 134217728 برابر با 128M است. 536870912 برابر با 512M است. عددی که بعد از “tried to allocate” می‌آید، اندازهٔ همان قطرهٔ آخر است که کاسه را لبریز کرد، نه اندازهٔ خودِ مشکل.

وردپرس محدودیت‌های خودش را روی محدودیت‌های PHP سوار می‌کند. WP_MEMORY_LIMIT (به‌طور پیش‌فرض 40M، یا محدودیت PHP اگر بیشتر باشد) بخش front end را کنترل می‌کند. WP_MAX_MEMORY_LIMIT (به‌طور پیش‌فرض 256M) عملیات سمت مدیریت مانند کتابخانهٔ رسانه و به‌روزرسانی افزونه‌ها را کنترل می‌کند که به‌طور موجهی به حافظهٔ بیشتری نیاز دارند. وردپرس هنگام بارگذاری بر اساس این ثابت‌ها ini_set('memory_limit', ...) را فراخوانی می‌کند — اما فقط در صورتی که هاست شما اجازهٔ ini_set را بدهد، و فقط تا سقف سختی که هاست تعیین کرده است. همین نکتهٔ آخر است که باعث می‌شود گاهی ویرایش wp-config.php انگار هیچ اثری ندارد.

رفع مشکل، به‌ترتیب

۱. محدودیت حافظهٔ وردپرس را در wp-config.php بالا ببرید. این اولین چیزی است که باید امتحان کنید، چون برگشت‌پذیر است و به هیچ چیز دیگری دست نمی‌زند.

define( 'WP_MEMORY_LIMIT', '256M' );
define( 'WP_MAX_MEMORY_LIMIT', '512M' );

اگر مطمئن نیستید این خط‌ها کجا باید قرار بگیرند یا می‌خواهید سایر ثابت‌های رایج هم هم‌زمان درست تنظیم شوند، ابزار wp-config generator ما یک بلوک تمیز می‌سازد که می‌توانید آن را کپی کنید. جای قرارگیری اهمیت دارد — هر چیزی که زیر خط “stop editing” باشد نادیده گرفته می‌شود.

۲. اگر این کار اثری نداشت، هاست شما PHP را محدود کرده است. memory_limit را در سطح PHP بالا ببرید. در php.ini:

memory_limit = 256M

روی بسیاری از هاست‌های اشتراکی نمی‌توانید مستقیماً php.ini را ویرایش کنید. به‌جای آن یک فایل .user.ini در ریشهٔ وب خود امتحان کنید، یا آن را از طریق .htaccess روی یک تنظیمات Apache/mod_php اعمال کنید:

php_value memory_limit 256M

توجه کنید که php_value در .htaccess روی nginx یا روی تنظیمات PHP-FPM خطای 500 می‌دهد، چون این یک دستور مخصوص Apache/mod_php است. اگر بعد از اضافه کردن آن خطای 500 گرفتید، دلیلش همین است — آن را حذف کنید و از .user.ini استفاده کنید.

۳. مقداری را که واقعاً فعال است تأیید کنید. به آنچه ویرایش کرده‌اید اعتماد نکنید؛ به آنچه PHP گزارش می‌دهد اعتماد کنید. یک فایل تک‌خطی در ریشهٔ وب خود بگذارید:

<?php echo ini_get('memory_limit');

آن را در مرورگر باز کنید، مقدار را بخوانید، سپس فایل را حذف کنید. اگر بعد از اینکه 256M تنظیم کردید هنوز 128M نشان می‌دهد، هاست شما دارد مقدار شما را بازنویسی می‌کند و باید با آن‌ها تماس بگیرید یا از تنظیمات کنترل‌پنلشان استفاده کنید.

بخشی که بیشتر راهنماها از آن رد می‌شوند

بالا بردن محدودیت، تشخیص است. حالا نحوهٔ خواندن نتیجه را ببینید.

اگر 256M تنظیم کنید و سایت زیر ترافیک عادی پایدار بماند، شما یک سقف موجه داشته‌اید که خیلی پایین بوده — این روی سایت‌هایی با کتابخانه‌های رسانهٔ بزرگ، ووکامرس یا صفحه‌سازها رایج است. کارتان تمام است.

اگر 256M تنظیم کنید و باز هم کرش کند، بعد 512M و باز هم کرش کند، دیگر آن را بالا نبرید. یک درخواست عادی وردپرس به 512M نیاز ندارد. وقتی مصرف حافظه بدون سقف بالا می‌رود، چیزی در حال حلقه زدن یا انباشته شدن است: افزونه‌ای که یک جدول کامل پایگاه داده را در یک آرایه بارگذاری می‌کند، یک add_action که به‌صورت بازگشتی خودش را فعال می‌کند، یک روال درون‌ریزی که همهٔ ردیف‌ها را هم‌زمان در حافظه نگه می‌دارد، یا دو افزونه که درون یک hook با هم درگیر شده‌اند. بالا بردن محدودیت یک حلقهٔ بی‌پایان را رفع نمی‌کند — فقط کرش را چند ثانیه عقب می‌اندازد و بازتولید آن را سخت‌تر می‌کند.

برای پیدا کردن مقصر، همهٔ افزونه‌ها را غیرفعال کنید و به یک قالب پیش‌فرض مانند Twenty Twenty-Four سوئیچ کنید. اگر خطا متوقف شد، افزونه‌ها را یکی‌یکی دوباره فعال کنید تا وقتی که خطا برگردد. لاگ دیباگ را روشن کنید تا محل از کار افتادن را ثبت کنید:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );

خط خطای مهلک در wp-content/debug.log نام فایل و شمارهٔ خطی را که آخرین قطعهٔ حافظه را اختصاص داده مشخص می‌کند. این معمولاً همان حلقه است، یا یک فراخوانی تابع با آن فاصله دارد.

کارهایی که نباید انجام دهید

WP_MEMORY_LIMIT را روی -1 یا 1024M تنظیم نکنید و فراموشش نکنید. حافظهٔ نامحدود یک نشتی را رفع نمی‌کند؛ اجازه می‌دهد یک درخواست از کنترل خارج‌شده کل سرور را ببلعد، که می‌تواند تمام سایت‌های دیگر روی همان سرور را از کار بیندازد و یک تماس از طرف هاست نصیبتان کند. یک سقف، یک ویژگی ایمنی است. آن را نگه دارید.

ini_set('memory_limit', '512M') را به‌عنوان راه‌حل اصلی داخل functions.php نچسبانید. این برای برخی خطاها خیلی دیر اجرا می‌شود — اگر کرش هنگام بارگذاری هستهٔ وردپرس و پیش از اجرای functions.php قالب شما رخ دهد، این خط هرگز اجرا نمی‌شود. wp-config.php زودتر بارگذاری می‌شود و جای درست این کار است.

فرض نکنید که مشکل از هاست است و پلن خود را ارتقا ندهید. گاهی واقعاً هاست کوچک است. اما اغلب همان کرش دقیق تا پلن بزرگ‌تر هم دنبالتان می‌آید، چون علت آن همراه افزونه‌های شما منتقل شده است. اول حلقه را کنار بگذارید؛ این کار رایگان است.

برای رفع خطای max_execution_time، memory_limit را بالا نبرید. این‌ها محدودیت‌های متفاوتی با پیام‌های متفاوت هستند. اتمام حافظه می‌گوید “Allowed memory size … exhausted.” یک تایم‌اوت می‌گوید “Maximum execution time … exceeded.” بالا بردن اشتباهی یکی از آن‌ها یک بعدازظهر را هدر می‌دهد.

هنوز گیر کرده‌اید؟

اگر تأیید کرده‌اید که محدودیت فعال واقعاً 256M یا بیشتر است، با همهٔ افزونه‌های خاموش و یک قالب پیش‌فرض تست کرده‌اید و باز هم حافظه تمام می‌شود، شما یک نشتی واقعی دارید که ارزش دنبال کردن در لاگ دیباگ را دارد، نه یک سقفی که ارزش بالا بردن داشته باشد. خط خطای مهلک را ثبت کنید، توجه کنید که به دایرکتوری کدام افزونه اشاره می‌کند، و همین گزارش باگ شماست. اول ثابت‌های پایهٔ wp-config.php خود را با ابزار wp-config generator درست کنید تا مطمئن باشید محدودیت‌ها همان‌جایی تنظیم شده‌اند که فکر می‌کنید — بعد بروید و لاگ را بخوانید.