Náhrada za WP-Cron
Queuety môže nahradiť vstavaný systém WordPress cron. Po zapnutí sa volania wp_schedule_event() zachytia a presmerujú cez plánovač Queuety namiesto predvoleného mechanizmu WP-Cron. Udalosti má spracovať worker Queuety, ktorý zabezpečuje vykonávanie nezávislé od návštevnosti stránky.
Aktuálne obmedzenie: prepojovací most vytvára plány Queuety, no worker nemá obslužný program pre úlohy
__queuety_cron_{hook}, ktoré vytvárajú, takže pôvodné spätné volania WordPress sa nikdy nespustia. Každá úloha zlyhá, opakuje sa po uplynutí čakacej doby a napokon sa odloží (#9). Kým sa tento problém nevyrieši, nezapínajte prepojovací most na stránke, na ktorej sa musia spúšťať udalosti cron.
Zapnutie náhrady
Zavolajte Queuety::replace_wp_cron() na začiatku inicializácie pluginu alebo témy:
use Queuety\Queuety;
Queuety::replace_wp_cron();
Zvyčajne sa volá v hlavnom súbore pluginu alebo v hooku plugins_loaded. Musí sa zavolať, keď je načítaný WordPress (plugin musí byť aktívny).
Čo zachytáva
Most cron sa pripája k trom filtrom WordPress:
| Funkcia WordPress | Pripojený filter | Správanie |
|---|---|---|
wp_schedule_event() |
pre_schedule_event |
Vytvorí plán Queuety s rovnakým intervalom |
wp_unschedule_event() |
pre_unschedule_event |
Odstráni zodpovedajúci plán Queuety |
wp_get_scheduled_event() |
pre_get_scheduled_event |
Vráti údaje plánu z Queuety |
Zachytávajú sa iba opakujúce sa udalosti (tie, ktoré majú vlastnosť schedule, napríklad hourly, twicedaily či daily). Jednorazové udalosti naplánované pomocou wp_schedule_single_event() sa nezachytávajú.
Mapovanie udalostí
Keď plugin zavolá wp_schedule_event(), Queuety vyhľadá názov plánu pomocou wp_get_schedules(), vytvorí plán Queuety s názvom obslužného programu __queuety_cron_{hook} a uloží pôvodný názov hooku WordPress a argumenty do dátovej časti plánu.
Zámer je, aby worker Queuety pri spracovaní naplánovanej úlohy zavolal do_action() s pôvodným názvom hooku a argumentmi. Existujúce spätné volania WordPress by tak spúšťal plánovač Queuety. CronBridge::process_cron_event() toto volanie implementuje, no zatiaľ ho nič nevyvoláva (pozrite si vyššie uvedené obmedzenie). Plány tiež vyhodnocuje iba dlho bežiaci proces wp queuety work, približne raz za minútu (pozrite si časť Plánovanie).
Určovanie intervalu
Most najprv vyhľadá názvy plánov pomocou wp_get_schedules() a potom použije vstavané predvolené hodnoty:
| Názov plánu | Interval |
|---|---|
hourly |
3,600 sekúnd |
twicedaily |
43,200 sekúnd |
daily |
86,400 sekúnd |
weekly |
604,800 sekúnd |
Vlastné intervaly plánov zaregistrované cez filter cron_schedules sú podporované, ak ich wp_get_schedules() vracia.
Obnovenie WP-Cron
Ak chcete obnoviť predvolený systém WordPress cron:
Queuety::restore_wp_cron();
Tým sa odstránia hooky filtrov a WordPress bude môcť znova spracúvať udalosti cron pomocou vstavaného mechanizmu. Upozorňujeme, že po nainštalovaní mosta sa DISABLE_WP_CRON definuje ako true a počas behu ho nemožno oddefinovať. Možno ho preto bude potrebné odstrániť z wp-config.php alebo proces reštartovať.
Kedy ho použiť
Náhrada je najvhodnejšia pre stránky s nízkou návštevnosťou, keď potrebujete presnejšie časovanie, než dokáže zabezpečiť WP-Cron, alebo už používate workery Queuety a chcete, aby vykonávanie cron prebiehalo v tom istom prevádzkovom systéme. Pomáha aj vtedy, keď záleží na centralizovanom monitorovaní, pretože udalosti cron sa potom zobrazujú v rovnakých záznamoch a metrikách ako ostatné úlohy vo fronte.
Obmedzenia
Existuje niekoľko dôležitých obmedzení. Vyžaduje sa aktívny Queuety pracovník, inak sa naplánované udalosti nikdy nespustia. Zachytávajú sa iba opakované plány; jednorazové udalosti vytvorené pomocou wp_schedule_single_event() zostávajú mimo mostíka. replace_wp_cron() tiež definuje DISABLE_WP_CRON pre zvyšok aktuálneho procesu PHP, takže restore_wp_cron() odstráni hooky, ale nedokáže zrušiť definíciu konštanty. A napokon, mostík funguje iba vtedy, keď je načítané WordPress, pretože závisí od filtrov WordPress a do_action().
Príklad: kompletné nastavenie
use Queuety\Queuety;
// In your plugin's main file.
add_action( 'plugins_loaded', function () {
Queuety::replace_wp_cron();
} );
Tu netreba volať Queuety::init(): aktívny plugin Queuety vytvorí svoje pripojenie pomocou prihlasovacích údajov k databáze WordPress a inicializuje sa pri plugins_loaded. replace_wp_cron() iba nainštaluje filtre, takže nezávisí od toho, či sa to už predtým vykonalo.
Potom sa opakované udalosti, ktoré pluginy registrujú pomocou wp_schedule_event(), ukladajú ako plány Queuety. Kým sa neopraví #9, ich callbacky sa nespustia.