Action Scheduler és WP-Cron: elakadt háttérfeladatok ellenőrzése

WordPress 5 perc olvasás

Egy webáruház adatbázisa hónapok alatt a duplájára nő, pedig „semmi nem változott”, az oldal elöl gyors. Ilyenkor gyakran az Action Scheduler táblái a ludasak: több százezer sikertelen vagy függő feladat egy olyan bővítménytől, amelyet már rég eltávolítottak, és amelyet a rendszer újra és újra megpróbál lefuttatni.

A WordPressben két háttérfeladat-rendszer dolgozik egymás mellett, és ha valami elakad, mindkettőt érdemes megnézni:

  • WP-Cron: a WordPress beépített ütemezője. Nem a szerver órájához igazodik, hanem a látogatásokhoz: minden oldalbetöltésnél megnézi, van-e esedékes feladat.
  • Action Scheduler: a WooCommerce-szel érkező feladatsor, amelyet sok más bővítmény is használ (például a Yoast SEO, a MailPoet, előfizetéses és e-mail-küldő bővítmények). A feladatai az actionscheduler_actions táblában várakoznak, a naplója az actionscheduler_logs táblába kerül, és a futtatását alapból a WP-Cron indítja.

Az alábbi parancsokat egy WooCommerce-szel telepített teszt-webhelyen futtattuk a cPanel tárhely Terminaljában; a WP-CLI alapjait a WP-CLI használatáról szóló cikk írja le.

Az Action Scheduler állapota

SSH nélkül a WordPress admin felületén is megnézheti: a WooCommerce › Állapot oldalon az ütemezett műveletek (Scheduled Actions) fülén szűrhet állapotra (függő, sikertelen, kész) és a feladat nevére (hook). Parancssorból gyorsabb:

cd ~/public_html
wp action-scheduler status
Data store: ActionScheduler_HybridStore
Runner: ActionScheduler_QueueRunner
Version: 4.1.0
status    count  oldest                      newest
complete  1      2026-10-27 19:56:51 +0000   2026-10-27 19:56:51 +0000
pending   2      2026-10-27 19:57:51 +0000   2026-10-28 03:00:00 +0000

Egészséges webhelyen a pending (függő) feladatok száma kicsi, és a legrégebbi is csak néhány perce vár; a failed (sikertelen) feladatok száma kevés, és ismert az okuk. Ha a függő feladatok órák óta várnak, a futtatás akadt el; ha több ezer a sikertelen, egy bővítmény hibázik ismétlődően.

Melyik feladat hány példányban vár vagy hibázott?

wp action-scheduler action list --status=pending --fields=id,hook,group,scheduled_date --per_page=20
wp action-scheduler action list --status=failed --format=count
wp action-scheduler action logs 1234

Az utolsó parancs egy feladat naplóját mutatja, benne a hiba okával. Nagyobb tömegnél a feladatnevek szerinti összesítés SQL-ben gyorsabb. Az aWh cPanel szerverein a wp db query nem működik, ezért a mysql parancsot használja (a jelszót tartalmazó ~/.my.cnf beállítását a WP-CLI cikk írja le), vagy futtassa a lekérdezést a phpMyAdminban, a saját táblaelőtagjával:

P=$(wp db prefix)
mysql "$(wp config get DB_NAME)" -e "SELECT hook, status, COUNT(*) AS db FROM ${P}actionscheduler_actions GROUP BY hook, status ORDER BY db DESC LIMIT 20"

A WP-Cron állapota

wp cron event list --fields=hook,next_run_relative,recurrence
wp cron event list --due-now

Ha sok feladat már esedékes (--due-now), de nem fut le, a WP-Cron nem indul el rendesen: például mert kevés a látogató, vagy mert a DISABLE_WP_CRON be van kapcsolva, de nincs helyette szerveroldali időzítés.

Gazdátlan WP-Cron-feladatok (amelyek egy eltávolított bővítményhez tartoznak, és a hookjukra már semmi nem figyel):

wp eval 'foreach ( _get_cron_array() as $ts => $events ) { foreach ( $events as $hook => $x ) { if ( ! has_action( $hook ) ) echo "gazdátlan: $hook\n"; } }'

Egy ilyen feladatot így törölhet: wp cron event delete <hook>.

Takarítás

Előtte mentse el az adatbázist (mysqldump, lásd a WP-CLI cikket), mert a törlés nem vonható vissza.

1. A gazdátlan feladatok törlése

Keresse meg azokat a függő vagy sikertelen feladatokat, amelyekhez már nem tartozik bővítmény:

wp eval 'global $wpdb; foreach ( $wpdb->get_col( "SELECT DISTINCT hook FROM {$wpdb->prefix}actionscheduler_actions WHERE status IN (\"pending\",\"failed\")" ) as $h ) { if ( ! has_action( $h ) ) echo $h, "\n"; }' > ~/gazdatlan-feladatok.txt
cat ~/gazdatlan-feladatok.txt

Nézze át a listát; ha egy név ismerős, és a bővítménye még kell, ne törölje. A függő feladatokat a nevük alapján vonhatja vissza:

while IFS= read -r hook; do wp action-scheduler action cancel "$hook" --all; done < ~/gazdatlan-feladatok.txt

A visszavont (canceled) és a régi sikertelen feladatokat a következő lépés takarítja el.

2. A régi feladatok és naplók törlése

Az Action Scheduler a kész és a visszavont feladatokat alapból körülbelül egy hónap után törli. A sikerteleneket nem, és ha a takarítás valamiért nem fut, minden megmarad. Kézzel, kis adagokban:

wp action-scheduler clean --status=complete,failed,canceled --before='14 days ago' --batch-size=500 --pause=1

Az adagok közötti szünet (--pause) miatt a takarítás nem terheli le az adatbázist, és a webhely közben is gyors marad. A megőrzési időt egy must-use bővítménnyel rövidítheti (wp-content/mu-plugins/action-scheduler-megorzes.php):

<?php
/**
 * Plugin Name: Action Scheduler: 14 napos megőrzés
 */
add_filter( 'action_scheduler_retention_period', function () {
    return 14 * DAY_IN_SECONDS;
} );

3. A tábla tömörítése

A törlés felszabadítja a sorokat, de a tábla a lemezen akkora marad. Nagy takarítás után futtassa a phpMyAdminban (a táblákat kijelölve, Tábla optimalizálása), vagy:

mysql "$(wp config get DB_NAME)" -e "OPTIMIZE TABLE ${P}actionscheduler_actions, ${P}actionscheduler_logs"

A futtatás megbízhatóvá tétele

A WP-Cront a látogatások indítják, így egy éjszaka kevés forgalmú webáruházban a feladatok órákat késhetnek, csúcsidőben pedig egy nehéz feladat egy látogató oldalbetöltését lassítja. Bízza a futtatást a szerverre:

  • Ha a webhelyet a WP Toolkit kezeli, a webhely kártyáján, a Teljesítmény résznél kapcsolja be a wp-cron.php fájl átvétele opciót.
  • Kézzel: kapcsolja ki a WP-Cront a wp-config.php fájlban (define( 'DISABLE_WP_CRON', true );), és állítson be helyette cron-feladatot a cPanelben. A lépéseket a WP-Cron cseréjéről szóló cikk írja le.

Nagy forgalmú webáruháznál az Action Scheduler sorát külön cron-feladatban is futtathatja, korlátozott adagokban, hogy ne foglalja le az összes PHP-folyamatot. A cPanel Cron-feladatok felületén (Speciális csoport) például ötpercenként:

/usr/local/bin/wp --path=/home/felhasznalonev/public_html action-scheduler run --batch-size=25 --batches=4 > /dev/null 2>&1

cPanel Cron-feladatok: új feladat hozzáadása

Egy háttérfeladat, amely egy percnél tovább fut, és minden alkalommal ugyanott tart, korlátlan munkát végez: ezt a bővítmény fejlesztőjének kell javítania. A sok hirtelen beérkező rendelés (például egy akció idején) is egyszerre több ezer feladatot ütemezhet; ha ilyenkor a webhely lelassul, a CloudLinux erőforrás-használat megmutatja, melyik korlátba ütközik a fiók.

Rendszeres ellenőrzés

Nézzen rá havonta a wp action-scheduler status kimenetére. Ha a függő feladatok száma tartósan ezres nagyságrendű, vagy a sikertelenek gyűlnek, az egy bővítmény hibájának jele, és jobb hetek alatt észrevenni, mint egy év múlva, amikor az adatbázis már gigabájtos. Az adatbázis többi tábláját a wp_options és a wp_postmeta tábla tisztításáról szóló cikk tárgyalja.

Vissza: WordPress leírások (39)