Náhrada za WP-Cron
Queuety může nahradit vestavěný systém WordPress cron. Po aktivaci zachytává volání wp_schedule_event() a směruje je přes plánovač Queuety místo výchozího mechanismu WP-Cron. Události má zpracovávat pracovní proces Queuety, který umožňuje spouštění nezávisle na návštěvnosti webu.
Aktuální omezení: most vytváří naplánované úlohy Queuety, ale pracovní proces nemá obslužnou rutinu pro úlohy
__queuety_cron_{hook}, které vytváří, takže původní zpětná volání WordPress se nikdy nespustí. Každá úloha selže, opakovaně se zkouší spustit s prodlevou a nakonec se odloží (#9). Most neaktivujte na webu, kde se musí spouštět události cron, dokud nebude tato chyba opravena.
Aktivace náhrady
Zavolejte Queuety::replace_wp_cron() na začátku inicializace pluginu nebo šablony:
use Queuety\Queuety;
Queuety::replace_wp_cron();
Obvykle se volá v hlavním souboru pluginu nebo v hooku plugins_loaded. Je třeba jej zavolat, když je načten WordPress (plugin musí být aktivní).
Co zachytává
Most cron se připojuje ke třem filtrům WordPress:
| Funkce WordPress | Použitý filtr | Chování |
|---|---|---|
wp_schedule_event() |
pre_schedule_event |
Vytvoří plánovanou úlohu Queuety se stejným intervalem |
wp_unschedule_event() |
pre_unschedule_event |
Odebere odpovídající plánovanou úlohu Queuety |
wp_get_scheduled_event() |
pre_get_scheduled_event |
Vrátí data plánované úlohy z Queuety |
Zachytávají se pouze opakované události (ty, které mají vlastnost schedule, například hourly, twicedaily, daily). Jednorázové události naplánované pomocí wp_schedule_single_event() se nezachytávají.
Jak se události mapují
Když plugin zavolá wp_schedule_event(), Queuety vyhledá název plánu pomocí wp_get_schedules(), vytvoří plánovanou úlohu Queuety s názvem obslužné rutiny __queuety_cron_{hook} a do datové části plánu uloží původní název hooku WordPress a argumenty.
Záměrem je, aby pracovní proces Queuety zpracovávající naplánovanou úlohu zavolal do_action() s původním názvem hooku a argumenty, aby se spustila stávající zpětná volání WordPress a časování řídilo Queuety. CronBridge::process_cron_event() toto volání implementuje, zatím ho však nic nevyvolává (viz výše uvedené omezení). Plány vyhodnocuje pouze dlouho běžící proces wp queuety work, a to přibližně jednou za minutu (viz Plánování).
Určení intervalu
Most nejprve vyhledá intervaly plánů pomocí wp_get_schedules() a poté použije vestavěné výchozí hodnoty:
| Název plánu | Interval |
|---|---|
hourly |
3,600 sekund |
twicedaily |
43,200 sekund |
daily |
86,400 sekund |
weekly |
604,800 sekund |
Vlastní intervaly plánů registrované pomocí filtru cron_schedules jsou podporovány, pokud je vrací wp_get_schedules().
Obnovení WP-Cron
Chcete-li obnovit výchozí systém WordPress cron:
Queuety::restore_wp_cron();
Tím se odstraní hooky filtrů a WordPress bude moci znovu zpracovávat události cron pomocí vestavěného mechanismu. Mějte na paměti, že při instalaci mostu se DISABLE_WP_CRON definuje jako true a za běhu ji nelze zrušit, takže bude možná nutné tento konstantní výraz odstranit z wp-config.php nebo proces restartovat.
Kdy jej použít
Náhrada se nejvíce hodí pro weby s nízkou návštěvností, když potřebujete spolehlivější časování, než jaké nabízí WP-Cron, nebo pokud už používáte pracovní procesy Queuety a chcete, aby se úlohy cron spouštěly ve stejném provozním systému. Pomáhá také v situacích, kdy je důležitá centralizovaná observabilita, protože se pak události cron zobrazují ve stejných protokolech a metrikách jako ostatní úlohy ve frontě.
Omezení
Existuje několik důležitých omezení. Bez aktivního pracovního procesu Queuety se naplánované události nikdy nespustí. Zachytávají se pouze opakované plány; jednorázové události vytvořené pomocí wp_schedule_single_event() zůstávají mimo tento most. replace_wp_cron() také po zbytek aktuálního procesu PHP definuje DISABLE_WP_CRON, takže restore_wp_cron() odstraní hooky, ale nemůže zrušit definici konstanty. A konečně, most funguje pouze tehdy, když je načten WordPress, protože závisí na filtrech WordPress a do_action().
Příklad: kompletní nastavení
use Queuety\Queuety;
// In your plugin's main file.
add_action( 'plugins_loaded', function () {
Queuety::replace_wp_cron();
} );
Není třeba zde volat Queuety::init(): aktivní plugin Queuety vytvoří připojení z přihlašovacích údajů databáze WordPress a inicializuje se v plugins_loaded. replace_wp_cron() pouze přidá filtry, takže není závislý na tom, zda k inicializaci došlo dříve.
Poté se opakované události, které pluginy registrují pomocí wp_schedule_event(), ukládají jako plánované úlohy Queuety. Dokud nebude opravena chyba #9, jejich zpětná volání se nespustí.