Přejít k obsahu

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:

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

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

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