תיקון השגיאה "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 אם היא גבוהה יותר) שולט בצד הקדמי של האתר. WP_MAX_MEMORY_LIMIT (ברירת מחדל 256M) שולט בפעולות בצד הניהול כמו ספריית המדיה ועדכוני תוספים, שבאמת צריכות יותר. וורדפרס קורא ל-ini_set('memory_limit', ...) בטעינה על סמך הקבועים האלה — אבל רק אם האחסון שלך מתיר ini_set, ורק עד לתקרה הקשיחה שהאחסון שלך קובע. החלק האחרון הזה הוא הסיבה לכך שעריכת wp-config.php נראית לפעמים כאילו לא עשתה כלום.
תיקון, לפי הסדר
1. העלה את מגבלת וורדפרס ב-wp-config.php. זה הדבר הראשון שכדאי לנסות כי הוא הפיך ולא נוגע בשום דבר אחר.
define( 'WP_MEMORY_LIMIT', '256M' );
define( 'WP_MAX_MEMORY_LIMIT', '512M' );
אם אתה לא בטוח איפה השורות האלה צריכות להיכנס, או שאתה רוצה שגם שאר הקבועים הנפוצים ייקבעו נכון באותה הזדמנות, מחולל ה-wp-config שלנו כותב בלוק נקי שאפשר להדביק. המיקום חשוב — כל דבר מתחת לשורת “stop editing” מתעלמים ממנו.
2. אם זה לא עשה כלום, האחסון שלך מגביל את 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 זורק שגיאת 500 בהתקנות nginx או PHP-FPM, כי זו הנחיה של Apache/mod_php. אם אתה מקבל 500 אחרי שהוספת את זה, זו הסיבה — מחק אותו והשתמש ב-.user.ini.
3. ודא את הערך שבאמת פעיל. אל תסמוך על מה שערכת; סמוך על מה ש-PHP מדווח. שים קובץ בן שורה אחת בשורש התיקייה של האתר:
<?php echo ini_get('memory_limit');
טען אותו בדפדפן, קרא את הערך, ואז מחק את הקובץ. אם עדיין כתוב 128M אחרי שהגדרת 256M, האחסון שלך דורס אותך ואתה צריך לפנות אליהם או להשתמש בהגדרה שבלוח הבקרה שלהם.
החלק שרוב המדריכים מדלגים עליו
העלאת המגבלה היא אבחון. הנה איך לקרוא את התוצאה.
אם הגדרת 256M והאתר נשאר יציב תחת תעבורה רגילה, הייתה לך תקרה לגיטימית שהייתה נמוכה מדי — נפוץ באתרים עם ספריות מדיה גדולות, ווקומרס, או בוני עמודים. סיימת.
אם הגדרת 256M והוא קרס שוב, ואז 512M והוא קרס שוב, תפסיק להעלות. בקשת וורדפרס רגילה לא צריכה 512M. כשצריכת הזיכרון מטפסת בלי תקרה, משהו רץ בלולאה או מצטבר: תוסף שטוען טבלת מסד נתונים שלמה למערך, add_action שמפעיל את עצמו רקורסיבית, שגרת ייבוא שמחזיקה כל שורה בזיכרון בבת אחת, או שני תוספים שנלחמים בתוך אותו hook. העלאת המגבלה לא מתקנת לולאה חסרת גבול — היא רק מזיזה את הקריסה כמה שניות קדימה ומקשה על השחזור שלה.
כדי למצוא את האשם, השבת את כל התוספים ועבור לתבנית ברירת מחדל כמו Twenty Twenty-Four. אם השגיאה נעצרת, הפעל מחדש אחד-אחד עד שהיא חוזרת. הפעל את יומן ה-debug כדי לתפוס איפה זה מת:
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 נטען מוקדם יותר וזה המקום הנכון.
אל תניח שזו בעיית אחסון ותשדרג את החבילה שלך. לפעמים זה באמת אחסון קטן מדי. לעתים קרובות בדיוק אותה קריסה עוקבת אחריך לחבילה הגדולה יותר כי הסיבה נסעה יחד עם התוספים שלך. שלול קודם את הלולאה; זה בחינם.
אל תעלה את memory_limit כדי לתקן שגיאת max_execution_time. אלה מגבלות שונות עם הודעות שונות. מיצוי זיכרון אומר “Allowed memory size … exhausted.” חריגת זמן אומרת “Maximum execution time … exceeded.” העלאה של הלא נכונה מבזבזת לך אחר צהריים שלם.
עדיין תקוע?
אם וידאת שהמגבלה החיה באמת 256M או יותר, בדקת עם כל התוספים כבויים ותבנית ברירת מחדל, וזה עדיין ממצה זיכרון — יש לך דליפה אמיתית ששווה לרדוף אחריה ביומן ה-debug, לא תקרה ששווה להעלות. תפוס את השורה הקטלנית, שים לב לתיקייה של איזה תוסף היא מצביעה, וזה דוח הבאג שלך. סדר קודם את קבועי ה-wp-config.php הבסיסיים שלך נכון עם מחולל ה-wp-config כדי שתדע שהמגבלות מוגדרות איפה שאתה חושב שהן — ואז לך תקרא את היומן.