¿Debo deshabilitar WP_CRON y en su lugar activar wp-cron.php del servidor cada pocos minutos?

12

Parece que WordPress dispara innecesariamente WP CRON en cada carga de página. Estoy pensando, en lugar de ejecutarlo en cada visita, ¿por qué no simplemente programarlo para que se ejecute cada 5 minutos a través del servidor? ¿Podría simplemente activar wp-cron.php cada cinco minutos y lograr el resultado deseado?

¿Hay alguna desventaja en esto?

TheBigK
fuente

Respuestas:

15

No hay inconvenientes para ejecutar WP CRON utilizando los trabajos cron del servidor. De hecho, esta es la práctica recomendada.

Según el documento oficial de desarrollo de plugins de WordPress :

WP-Cron no se ejecuta continuamente, lo que puede ser un problema si hay tareas críticas que deben ejecutarse a tiempo. Hay una solución fácil para esto. Simplemente configure el programador de tareas de su sistema para que se ejecute en los intervalos que desee (o en el momento específico necesario).

Para hacer esto, primero debe deshabilitar el comportamiento cron predeterminado en wp-config.php:

define('DISABLE_WP_CRON', true);

Luego, programe wp-cron.phpdesde su servidor. Para Linux, eso significa:

crontab -e

Sin embargo, en lugar de ejecutarlo en la línea de comandos (CLI), ejecútelo como una solicitud HTTP. Para eso puedes usar wget:

*/5 * * * * wget -q -O - https://your-domain.com/wp-cron.php?doing_wp_cron

WordPress carga todos los archivos principales necesarios, complementos, etc. wp-cron.phpcon el siguiente CÓDIGO:

if ( !defined('ABSPATH') ) {
    /** Set up WordPress environment */
    require_once( dirname( __FILE__ ) . '/wp-load.php' );
}

Así que no se preocupe si WordPress no carga características importantes.

Fayaz
fuente
1
La documentación de WordPress.org a la que se vinculó menciona wget http://YOUR_SITE_URL/wp-cron.phpsin agregar ?doing_wp_cron ¿Entonces, uno es mejor que el otro? ¿Qué hace la adición de ?doing_wp_cronque la no versión no lo hace?
Garconis
Probablemente solo para que sus registros muestren la cadena de consulta para que sepa con certeza cómo se llamó.
Slbox el
1
No estoy de acuerdo con esto en absoluto. En primer lugar, no es cierto que sea "recomendado". En segundo lugar, este método paralizará cualquier complemento que use el método real recomendado para programar eventos. Creo que este es realmente un mal consejo. Casi nadie debería apagar el cron a menos que tenga una razón MUY específica para hacerlo. La única razón por la que puedo pensar es si estás rompiendo WordPress por un CDN o algo así. Esta NO es una práctica normal.
John Dee
1
@ JohnDee: este método en realidad no deshabilita cron, deshabilita el método WP Cron que comprueba e intenta ejecutar trabajos cron en cada carga de página. define('DISABLE_WP_CRON', true);desactiva solo esa parte del proceso cron y luego llama al script cron con un código como: */5 * * * * wget -q -O - https://your-domain.com/wp-cron.php?doing_wp_cronen el servidor se asegura de que se ejecuten los trabajos cron. Cualquier complemento de programación ni siquiera sabrá la diferencia.
Fayaz
1
El enlace de documentación de WordPress.org sobre este tema cambió a developer.wordpress.org/plugins/cron/…
aldemarcalazans
2

Hay un par de inconvenientes: en primer lugar, cuando se usa wp-cron.php como cli, no se establecen cosas como las variables $ _SERVER. La gente supera esta limitación mediante el uso de una solicitud curl para wp-cron.php.

En segundo lugar, porque WP no está cargado con wp-cron.php; si usa un complemento de envío SMTP, este no se cargará cuando llame a wp-cron. Nuevamente, el uso de una llamada curl anula este problema. Curl parece ser el método más utilizado.

Sin embargo; Prefiero usar wp-cli después de configurar los ajustes de correo en postfix y (para nginx) php-fpm config correctamente y configurar un crontab como

*/5    *   *   *   *  wp cron event list --skip-plugins --skip-themes --path="/var/www/vhosts/example.com/httpdocs/wp" --fields=hook,next_run_relative --format=csv | awk -F, '$2=="now" {print $1}' | xargs -r wp --path="/var/www/vhosts/example.com/httpdocs/wp" cron event run $1

(Enumere todos los crons con campos específicos en formato csv: el gancho es el nombre del cron, la próxima ejecución relativa es el momento. Elimine los que muestran 'ahora' como la próxima ejecución (los que vencen ahora) usando AWK, pase esa lista a xargs a llame wp cron event run $HOOKa cada cron.) El uso de wp-cli carga WordPress correctamente (elijo omitir complementos al enumerar los crons, ya que los errores de código y las advertencias de php arruinarán la salida con script; pero no los omitiré cuando ejecute el cron con xargs, como el cron puede necesitar que se carguen los complementos)

Espero que esto te dé algunos consejos sobre qué buscar.

TechnicalChaos
fuente
2
¿Qué tal la configuración: / 15 * * * wget -q -O - yourdomain.com/wp-cron.php?doing_wp_cron como lo sugiere TomMcFarlin - tommcfarlin.com/wordpress-cron-jobs . Parece hacer bien el trabajo. Agradecería su comentario
TheBigK
Sí, como mencioné en todas partes, la gente elige usar curl (wget o cualquier otra llamada http) para activar los crons, y ese método no tiene nada de malo. Solo estaba aconsejando los problemas de llamar directamente al archivo php wp-cron, que no incluiría los archivos requeridos, y aconsejando otro método alternativo si quisieras darle un poco de sabor.
TechnicalChaos
0

Hay muchas razones para no deshabilitar el wp-cron. De hecho, es casi imposible encontrar un caso de uso para hacer esto. No ralentiza su sitio y se usa para cosas de las que puede no estar al tanto.

Muchos complementos usan el WP-Cron para programar cosas. Pueden confundirse si apaga el programador.

Hay una proliferación de tutoriales sobre este tema porque es confuso y porque no hace mucho a su sitio cuando lo deshabilita. Lo que hará es causar dolor de cabeza al desarrollador que tiene que solucionar el misterioso problema que crea en seis meses.

Además, WP Heartbeat se dispara cada 15 segundos en el área de administración, resolviendo este problema para el 99% de las personas que piensan que lo tienen.

John Dee
fuente
2
Esta es una respuesta terrible: no están desactivando WP Cron. Simplemente están deshabilitando la invocación de WP Cron en la carga de la página y, en su lugar, la están descargando al demonio cron del sistema. Sheesh
Barry Chapman
De todos modos, la razón principal para dejarlo solo es que muchos complementos ahora están usando el cron para ejecutar tareas de fondo extendidas. Puede estropear algo que la persona SIGUIENTE está haciendo, porque esperan que el sistema funcione de manera estándar. ¡Buena suerte!
John Dee
Si un complemento está codificado de una manera que se rompe por completo si wp cron está deshabilitado, significa que ha sido programado por un incompetente, y es mejor desinstalarlo de inmediato.
Magnetic_dud
Bueno, los dos comentarios aquí prueban mi punto. Tienes un desarrollador que dice "esto no deshabilita el cron, simplemente lo baraja al cron del sistema operativo", que es una interrupción en WordPress, que es neutral para el sistema operativo. Luego, otro desarrollador dice "oye, es responsabilidad del desarrollador del complemento planificar la aniquilación de wp cron". Uh ok Entonces, si desea la funcionalidad cron, ¿debe PLANIFICAR la eliminación del sistema cron? ¿A qué? El sistema cron de respaldo? Ese comentario no tiene sentido [obviamente].
John Dee
De todos modos, el estado actual es "CONFUSIÓN TOTAL". Ese es el estado actual. La única solución, desde un punto de vista framwork, es decirle a la gente: HAY UNA RAZÓN POR LA QUE EXISTE EL SISTEMA WP-CRON. NO LO APAGUE. La otra opción es 10,000 opiniones diferentes y diferentes. Que es lo que tenemos ahora.
John Dee
0

Todavía tengo que encontrar una verdadera desventaja para descargar wp-cron a un servicio externo. Haciendo esto por muchos años ahora.

Especialmente en el mundo de hoy donde puede ejecutar aplicaciones como microservicios.

Utilizo contenedores Docker separados para cada componente de WordPress: php, web, db, crontab, redis, etc. Tener crontab como contenedor separado, llamar a wp-cron a través de http utilizando la red local, ejecutándose solo cuando lo necesito.

Esto reduce el estrés en los nodos del backend y mejora la seguridad al tener una superficie de ataque más pequeña.

Si el desarrollador no puede descubrir cómo hacer cosas sin tener que llamar a wp-cron en cada carga de la página, diablos, esto solo habla de inexperiencia en su nombre. "Dejarlo solo", porque no entiendes cómo funcionan las cosas, no es una buena razón para mantenerlo.

Radoslav Stefanov
fuente