هذه الرسالة تعني أنّ طلبَ PHP واحدًا حاول أن يمسك في الذاكرة أكثر ممّا يُسمَح له. والحدُّ للطلب لا للخادم: فحدُّ 256M لا يعني أنّ عند الخادم 256M.
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted
الرقم 134217728 هو 128M. والرقمُ في الرسالة هو الحدُّ الحاليّ دائمًا، فلا تحتاج أن تبحث عنه أبدًا.
أين ترفعه
- EGPNL — إعدادات PHP للموقع، وهو المكان الصحيح لأنّه ينجو من التحديثات.
- php.ini —
memory_limit = 256M، للحوض كلِّه. - wp-config.php —
define("WP_MEMORY_LIMIT", "256M");لووردبريس وحده.
وحدٌّ فوق 512M يخفي علّةً في الغالب الأعمّ. فقراءةُ جدولٍ كامل في مصفوفة، أو ملفٍّ كامل بدل تدفيقه، تحتاج إصلاحًا لا إطعامًا.
اعرف ما يأكلها
echo round(memory_get_peak_usage(true)/1048576, 1) . ' MB';
ضع ذلك في آخر الصفحة البطيئة فيطبع الذروة. ثمّ نصِّف: عطّل نصف العمل بتعليق وانظر أيَّ نصفٍ تتبع الذروة.
السببان المعتادان
- استعلامٌ بلا حدّ. SELECT بلا LIMIT على جدولٍ كبر. مرّ عليه صفحةً صفحة.
- مكتبةُ صورٍ على ملفٍّ كبير. فصورةٌ بعرض 6000 بكسل تكلّف في الذاكرة أضعافَ ما يوحي به حجمُ ملفّها، لأنّها تصير غير مضغوطةٍ بمجرّد تحميلها.
ومهمّةٌ مجدولة تفشل عند 128M وتعمل عند 512M لم تُصلَح. ستفشل ثانيةً حين تكبر البيانات، الثالثةَ فجرًا.