Preskočiť na obsah

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:

PHP
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:

PHP
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

PHP
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.