דילוג לתוכן
תצורה

תיקון השגיאה "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 כדי שתדע שהמגבלות מוגדרות איפה שאתה חושב שהן — ואז לך תקרא את היומן.

FAQ

שאלות

איך מתקנים את השגיאה “Allowed memory size exhausted” ב-WordPress?

הוסף define( 'WP_MEMORY_LIMIT', '256M' ); לקובץ wp-config.php, מעל השורה /* That's all, stop editing! */, כי מכל מה שנמצא מתחתיה מתעלמים. זה מחזיר את רוב האתרים לפעולה תוך פחות מדקה, אבל התייחס למגבלה הגבוהה יותר ככלי אבחון ולא כתרופה קבועה.

כמה MB הם 268435456 בייטים בשגיאת הזיכרון של PHP?

המספר 268435456 בייטים הוא 256M. לשם השוואה, 134217728 הוא 128M ו-536870912 הוא 512M. המספר ש-PHP מדפיס הוא גודל ההקצאה שנכשלה בסוף ולא גודל הבעיה עצמה, אז הוא מספר לך באיזו תקרה נתקלת ולא מה הסיבה.

למה עריכת wp-config.php לא משנה את מגבלת הזיכרון של PHP?

האחסון שלך מגביל את PHP. המגבלה נקבעת בקריאה ל-ini_set בזמן הטעינה, וזה עובד רק אם האחסון מתיר ini_set ורק עד לתקרה הקשיחה שהוא קובע. ודא את הערך החי עם קובץ בן שורה אחת בשורש האתר שמדפיס את ini_get('memory_limit'), ואז מחק אותו.

למה php_value memory_limit ב-.htaccess גורם לשגיאת 500?

ההנחיה php_value שייכת ל-Apache ול-mod_php, ולכן היא זורקת שגיאת 500 בהתקנות nginx או PHP-FPM. מחק את השורה והשתמש בקובץ .user.ini בשורש האתר במקום, או הגדר את memory_limit ב-php.ini אם האחסון שלך מתיר לך לערוך אותו.

האם בטוח להגדיר את מגבלת הזיכרון של WordPress ללא הגבלה?

לא. זיכרון ללא הגבלה לא מתקן דליפה; הוא נותן לבקשה משתוללת לצרוך את כל השרת ויכול להפיל כל אתר אחר על אותה מכונה. תקרה היא תכונת בטיחות. אם 512M עדיין קורס, תפסיק להעלות את המספר ותמצא את הלולאה במקום.