אירועי cron שלא רצו: זיהוי תקיעות ושחזור משימות

כשאירועי cron לא רצים יממה, גיבויים מפסיקים, מיילים נתקעים וסנכרונים נשברים. כך מזהים את ה-hook התקוע ומחזירים אותו לפעולה.

בוורדפרס, "missed cron" אינו רעש - זה אומר שמשימה ידועה הייתה אמורה לרוץ לפני 24 שעות או יותר ופשוט לא רצה. כל משימה כזו היא תכונה אבודה: גיבוי שלא נוצר, מייל שלא נשלח, סנכרון שלא קרה. כשמספר ה-hooks התקועים גדל, האתר שקט אבל בפועל מתפקד חלקית.

למה זה משנה

וורדפרס מסתמך על cron עבור כמעט כל פעולה רקע: wp_version_check שמאתר עדכוני ליבה, publish_future_post שמפרסם פוסטים מתוזמנים, wp_scheduled_delete שמרוקן את הפח, ו-hooks של תוספים כמו action_scheduler_run_queue של WooCommerce, wpseo_onpage_fetch של Yoast, או updraft_backup של UpdraftPlus. כשאירוע מאחר ביממה, הוא לא רץ "עוד מעט" - הוא מצטבר עם אירועים נוספים, וברוב המקרים מערכת WP-Cron נכנעת ומפסיקה לנסות. התוצאה: WooCommerce לא מעדכן סטטוס הזמנות, Yoast לא בודק קישורים שבורים, UpdraftPlus לא מגבה - ואתה לא יודע על כך עד שאתה צריך גיבוי.

איך לזהות

הדרך הוודאית היא WP-CLI:

wp cron event list --format=table --fields=hook,next_run_relative,next_run_gmt

כל hook עם next_run_relative שלילי באופן משמעותי (למשל -2 days) הוא תקוע. חלופה ויזואלית: התקן את התוסף החינמי WP Crontrol ולך ל-Tools > Cron Events. הוא מסמן באדום את ה-hooks שעבר זמנם. ב-RankPlus עצמו, הסריקה מאתרת hooks שה-next_run שלהם פחות מ-time() - 86400.

איך לתקן

  1. הרץ ידנית את כל המשימות שעבר זמנן: wp cron event run --due-now. זה מאלץ ביצוע מיידי, מנותק מ-loopback HTTP.
  2. אם זה כושל עם שגיאת PHP, פתח את wp-content/debug.log אחרי הפעלת WP_DEBUG_LOG ב-wp-config.php. השגיאה תזהה את התוסף שמכשיל את ה-loop.
  3. אם hook מסוים תקוע ולא צריך לרוץ יותר (למשל מתוסף שהוסר), מחק אותו: wp cron event delete <hook>.
  4. תקן את הסיבה השורש: באתר עם תנועה נמוכה, WP-Cron הפנימי לעולם לא יורץ. עבור ל-system cron - ראה הביקורת wp_cron_status למדריך מלא.
  5. בדוק את הקובץ doing_cron transient - אם הוא תקוע, ראה הביקורת doing_cron_stale.

טעויות נפוצות

  • הפעלה ידנית של wp-cron.php בדפדפן: זה לא תמיד עובד, כי WordPress מבצע lock דרך transient. הרצה דרך WP-CLI אמינה הרבה יותר.
  • מחיקת hooks בלי לבדוק מי יצר אותם: hook עם שם זר עלול להיות של תוסף קריטי שעדיין פעיל. בדוק עם wp cron event list איזה תוסף רשם אותו לפני מחיקה.
  • הסתמכות על שירות חיצוני בלי לוודא שהגיע: cron-job.org או EasyCron יכולים להפסיק לעבוד בשקט אם השרת חוסם UA שלהם או דורש Basic Auth.
  • WP_CRON_LOCK_TIMEOUT שגוי: ערך נמוך מדי גורם לשני תהליכי cron לרוץ במקביל ולנסות לבצע אותה משימה. ברירת המחדל (60) היא בדרך כלל בסדר.

בדיקה לאחר תיקון

הרץ שוב wp cron event list - כל ה-next_run_relative צריכים להיות בעתיד. בנוסף, חכה 5-15 דקות וודא שmissed_scheduled_posts מתפנים, שגיבוי הבא רץ בזמנו, ושמיילים יוצאים. ב-RankPlus הסטטוס יחזור לירוק במחזור הסריקה הבא.

טיפ: אם אתה לא רוצה להתקין WP-CLI, תוסף Advanced Cron Manager (חינמי) מאפשר להריץ hook בודד בלחיצת כפתור מתוך לוח הבקרה - שימושי כשאתה רוצה לאלץ הרצה בודדת בלי לרוץ ל-SSH. ליישום באתרים גדולים, שווה לשקול להגדיר התראות אוטומטיות שמודיעות לך כשhook קריטי לא רץ במשך X שעות - זה יחסוך גילוי מאוחר. כלים כמו תוסף Advanced Cron Manager או שירות monitoring חיצוני יכולים לבצע זאת. ובסביבות עם הרבה אתרים, מומלץ ליצור dashboard מרכזי שמציג את סטטוס ה-cron של כל האתרים יחד, כדי לזהות בעיות מערכתיות (למשל ספק אחסון שמרבה להפיל cron) לפני שהן הופכות לבעיות בכל אתר בנפרד.