Saltar al contenido

Reemplazo de WP-Cron

Queuety puede reemplazar el sistema WordPress cron integrado. Al activarse, las llamadas a wp_schedule_event() se interceptan y se redirigen al programador de Queuety en lugar de usar el mecanismo predeterminado de WP-Cron. Los eventos están pensados para que los procese el trabajador Queuety, que permite ejecutarlos independientemente del tráfico del sitio.

Limitación actual: el puente crea las programaciones de Queuety, pero el trabajador no tiene un controlador para los trabajos de __queuety_cron_{hook} que generan, por lo que las devoluciones de llamada originales de WordPress nunca se ejecutan. Cada trabajo falla, se vuelve a intentar con un intervalo de espera y finalmente queda enterrado (#9). No active el puente en un sitio cuyos eventos de cron deban ejecutarse hasta que se corrija el problema.

Activar el reemplazo

Llame a Queuety::replace_wp_cron() al principio de la inicialización del plugin o del tema:

PHP
use Queuety\Queuety;

Queuety::replace_wp_cron();

Normalmente, esto se llama en el archivo principal del plugin o en un hook plugins_loaded. Debe llamarse mientras WordPress esté cargado (el plugin debe estar activo).

Qué intercepta

El puente cron se conecta a tres filtros WordPress:

Función de WordPress Filtro conectado Comportamiento
wp_schedule_event() pre_schedule_event Crea una programación de Queuety con el mismo intervalo
wp_unschedule_event() pre_unschedule_event Elimina la programación correspondiente de Queuety
wp_get_scheduled_event() pre_get_scheduled_event Devuelve los datos de programación de Queuety

Solo se interceptan los eventos recurrentes (los que tienen una propiedad schedule como hourly, twicedaily o daily). Los eventos de una sola ejecución programados con wp_schedule_single_event() no se interceptan.

Cómo se asignan los eventos

Cuando un plugin llama a wp_schedule_event(), Queuety resuelve el nombre de la programación mediante wp_get_schedules(), crea una programación de Queuety con el nombre del controlador __queuety_cron_{hook} y guarda el nombre original del hook WordPress y sus argumentos en los datos de la programación.

La idea es que el trabajador Queuety que procesa el trabajo programado llame a do_action() con el nombre original del hook y sus argumentos, de modo que las devoluciones de llamada existentes de WordPress se ejecuten según los tiempos que determine Queuety. CronBridge::process_cron_event() implementa esa llamada, pero aún no hay nada que la invoque (consulte la limitación anterior). Además, las programaciones solo se evalúan en un proceso wp queuety work de larga duración, aproximadamente una vez por minuto (consulte Programación).

Resolución de intervalos

El puente resuelve primero los nombres de programación mediante wp_get_schedules() y, si no los encuentra, recurre a los valores predeterminados integrados:

Nombre de la programación Intervalo
hourly 3,600 segundos
twicedaily 43,200 segundos
daily 86,400 segundos
weekly 604,800 segundos

Se admiten intervalos de programación personalizados registrados mediante el filtro cron_schedules, siempre que wp_get_schedules() los devuelva.

Restaurar WP-Cron

Para volver al sistema predeterminado de WordPress cron:

PHP
Queuety::restore_wp_cron();

Esto elimina los hooks de filtro y permite que WordPress vuelva a gestionar los eventos de cron mediante el mecanismo integrado. Tenga en cuenta que DISABLE_WP_CRON se define como true al instalar el puente y no se puede desdefinir durante la ejecución; quizá deba eliminar esa constante de wp-config.php o reiniciar el proceso.

Cuándo usarlo

El reemplazo resulta especialmente útil si su sitio tiene poco tráfico, si necesita una programación más fiable que la que puede ofrecer WP-Cron o si ya ejecuta trabajadores Queuety y quiere que la ejecución de cron forme parte del mismo sistema operativo. También facilita la observabilidad centralizada, ya que los eventos de cron aparecen en los mismos registros y métricas que el resto del trabajo de la cola.

Limitaciones

Hay varias limitaciones importantes. Se necesita un trabajador Queuety activo; de lo contrario, los eventos programados nunca se ejecutarán. Solo se interceptan las programaciones recurrentes; los eventos de una sola ejecución creados con wp_schedule_single_event() quedan fuera del puente. replace_wp_cron() también define DISABLE_WP_CRON durante el resto del proceso actual de PHP, por lo que restore_wp_cron() elimina los hooks, pero no puede desdefinir la constante. Por último, el puente solo funciona si WordPress está cargado, ya que depende de los filtros WordPress y de do_action().

Ejemplo: configuración completa

PHP
use Queuety\Queuety;

// In your plugin's main file.
add_action( 'plugins_loaded', function () {
    Queuety::replace_wp_cron();
} );

No es necesario llamar a Queuety::init() aquí: el plugin activo Queuety crea su conexión con las credenciales de la base de datos de WordPress y se inicializa en plugins_loaded. replace_wp_cron() solo instala los filtros, por lo que no depende de que eso haya ocurrido antes.

Después de esto, los eventos recurrentes que los plugins registren con wp_schedule_event() se guardarán como programaciones de Queuety. Hasta que se corrija #9, sus devoluciones de llamada no se ejecutarán.