אם נתקלתם בהודעה "Maximum execution time of 30 seconds exceeded", פירוש הדבר שסקריפט PHP רץ יותר זמן מהמותר לפי ההגדרה max_execution_time. בוורדפרס זה קורה בדרך כלל בזמן עדכונים, ייבוא תוכן וגיבויים.
בפוסט הזה תמצאו את הדרכים להגדיל את max_execution_time, ואיך לדעת באיזו מהן השרת שלכם תומך. לפתרון מהיר של השגיאה עצמה, הציצו בסניפט תיקון השגיאה Maximum Execution Time Exceeded בוורדפרס.
בדקו קודם את הערך הנוכחי
היכנסו אל כלים > בריאות האתר > מידע ופתחו את החלק שרת (Server).
- PHP time limit הוא הערך הנוכחי של
max_execution_timeבשניות. - PHP SAPI מראה לכם איזו שיטה תעבוד:
apache2handlerהוא Apache mod_php,fpm-fcgiהוא PHP-FPM ו-litespeedהוא LiteSpeed.
חזרו למסך הזה אחרי כל שינוי כדי לוודא ש-PHP אכן קלט את הערך החדש.
הגדלת max_execution_time בוורדפרס
בחרו את השיטה שמתאימה ל-PHP SAPI שלכם. בדוגמאות נשתמש ב-300 שניות, מגבלה זהה לזו שליבת וורדפרס מגדירה לעצמה בזמן עדכונים.
1. wp-config.php (עובד בכל שרת)
הוסיפו את הקוד הבא לקובץ wp-config.php, מעל השורה /* That's all, stop editing! */:
if ( function_exists( 'set_time_limit' ) ) {
set_time_limit( 300 );
}
אל תוותרו על הבדיקה function_exists(). החל מ-PHP 8, פונקציה שנחסמה באמצעות disable_functions נחשבת כלא מוגדרת, כך שקריאה ישירה אליה תפיל את האתר אצל חברות אחסון שחוסמות אותה.
2. .user.ini (PHP-FPM ו-CGI)
ב-PHP-FPM (התצורה הנפוצה ביותר כיום), צרו קובץ .user.ini באותה תיקייה שבה נמצא wp-config.php:
max_execution_time = 300
max_input_time = 300
כברירת מחדל, PHP קורא את הקובץ מחדש כל 5 דקות (user_ini.cache_ttl), כך שייתכן שהשינוי לא ייכנס לתוקף מיד.
3. .htaccess (Apache mod_php או LiteSpeed)
גבו קודם את הקובץ .htaccess, ולאחר מכן הוסיפו את השורה הבאה:
php_value max_execution_time 300
השיטה הזו עובדת רק עם Apache mod_php או LiteSpeed. ב-Apache עם PHP-FPM ההנחיה php_value אינה מוכרת, והאתר יחזיר שגיאת 500. במקרה כזה הסירו אותה והשתמשו ב-.user.ini.
4. php.ini (שרת VPS או שרת ייעודי)
אם יש לכם שליטה על השרת, הגדירו את הערך ב-php.ini והפעילו מחדש את PHP-FPM או את Apache. באחסון משותף השתמשו במסך הגדרות ה-PHP בלוח הבקרה של חברת האחסון.
max_execution_time = 300
איך max_execution_time עובד
ההנחיה קובעת כמה שניות סקריפט רשאי לרוץ (30 כברירת מחדל). קריאה ל-set_time_limit() משנה את המגבלה בזמן ריצה ומאפסת את המונה.
בלינוקס, גרסאות PHP הסטנדרטיות סופרות רק את זמן הריצה של הסקריפט עצמו. שאילתות למסד הנתונים וקריאות API מרוחקות אינן נספרות, כך שבקשה יכולה לרוץ יותר מ-30 שניות בלי שתופיע השגיאה הזו.
max_input_time היא מגבלה נפרדת לעיבוד הקלט של הבקשה (למשל נתוני POST והעלאת קבצים). ערך ברירת המחדל שלה הוא -1, כלומר היא משתמשת בערך של max_execution_time. לא ניתן לשנות אותה עם set_time_limit() או ini_set(), אלא רק ב-.user.ini, ב-.htaccess או ב-php.ini.
כשהגדלת המגבלה של PHP אינה מספיקה
אם בקשות ארוכות עדיין נקטעות גם אחרי שהגדלתם את המגבלה, שכבה אחרת היא שעוצרת אותן, בדרך כלל עם שגיאת 502, 504 או 524.
- ההגדרה
request_terminate_timeoutשל PHP-FPM הורגת את ה-worker אחרי זמן מוגדר. היא כבויה כברירת מחדל, אך חברות אחסון רבות מפעילות אותה. - ערך ברירת המחדל של
fastcgi_read_timeoutב-Nginx הוא 60 שניות. - Cloudflare מחזירה שגיאת 524 אם שרת המקור לא מגיב תוך 125 שניות (בחבילות שאינן Enterprise).
רק חברת האחסון יכולה להגדיל את הערכים האלה. למשימות כבדות חד פעמיות השתמשו ב-WP-CLI: בשורת הפקודה ערך ברירת המחדל של max_execution_time הוא 0, כלומר אין מגבלה כלל.
WP-Cron רץ כבקשת web רגילה, ולכן גם עליו חלות אותן מגבלות. למשימות מתוזמנות ארוכות, בטלו את WP-Cron והשתמשו ב-cron job אמיתי בשרת שמריץ את wp cron event run --due-now.
הציצו גם בפוסט אופטימיזציה לקונפיגורציה של וורדפרס באמצעות wp-config.php ובתיעוד ההנחיה במדריך של PHP.
שאלות נפוצות
הנה כמה שאלות נפוצות על מגבלת הזמן של PHP בוורדפרס:
set_time_limit() בזמן עדכונים.
php_value. ב-PHP-FPM היא גורמת לשגיאת 500. בדקו את PHP SAPI במסך בריאות האתר, ואם מופיע שם fpm-fcgi השתמשו ב-.user.ini.
max_input_time = 300 ב-.user.ini או ב-php.ini, או php_value max_input_time 300 ב-.htaccess כאשר השרת עובד עם mod_php. לא ניתן לשנות אותה מתוך wp-config.php מכיוון ש-PHP לא מאפשר זאת בזמן ריצה.