El término cron viene del griego chronos (χρόνος) que significa "tiempo" y se utiliza para identificar los procesos que se ejecutan a intervalos regulares. Es equivalente a las Tareas Programadas de Windows. El cron en WordPress se gestiona desde el archivo wp-cron.php y si descuidamos su atención nos puede provocar mas de un quebradero de cabeza.

Veamos como que podemos hacer para optimizar su funcionamiento.

Como funciona el cron en WordPress

El cron en WordPress es completamente funcional de serie y no necesitamos hacer nada para que se ejecuten las programaciones. Eso nos permite recibir los avisos de actualizaciones, del estado de salud de nuestra web, ejecuta la programaciones de copias de seguridad, las conexiones a servicios externos, etc. Entonces, ¿debemos hacer algo al respecto? Sin lugar a dudas, la respuesta es que SI. Veamos por qué.

En realidad, WordPress ejecuta el archivo wp-cron.php cada vez que nuestra web recibe una visita. Este archivo se encarga de revisar las tareas pendientes y ejecutarlas según el calendario de programaciones. Una solución sencilla que emula a un cron real del sistema operativo.

Sin embargo, dependemos de que nuestra web sea visitada. Si tenemos pocas visitas, las programaciones no se ejecutarán a su hora. Si por el contrario, hacemos bien nuestro trabajo y las visitas aumentan el consumo de recursos de nuestro servidor se disparará. El resultado afectará nuestro bolsillo (tendremos que pagar ese consumo adicional) y lo que es peor nuestros visitantes pueden encontrarse con una web lenta porque el servidor está realizando otras tareas.

La explicación es muy simple. Los servidores web admiten un número máximo de conexiones simultáneas. Y estamos dedicando el 50% de este preciado recurso a procesos internos, cuando deberíamos atender las peticiones de nuestros usuarios.  La situación es más grave si hay programadas tareas de larga duración (backup, escaneos de seguridad, actualización del catalogo de nuestro Woocommerce, etc), en ese caso tendremos el proceso de escucha bloqueado durante lo que dure la ejecución. 

Si como suele ser el caso, tenemos varias instalaciones en el mismo servidor, es posible llegar al extremo que nuestra web no esté disponible durante algún tiempo.


Gestionar adecuadamente el cron en WordPress

Para optimizar la gestión del cron debemos hacer dos cosas.

  1. Configurar en nuestro hosting o VPS un cron del sistema operativo que ejecute las tareas programadas
  2. Desactivar la ejecución de wp-cron.php en nuestro WordPress.  

El segundo punto es el más sencillo de todos. Basta con editar el archivo wp-config.php y añadir las líneas siguientes:

// desactiva wp-cron
define('DISABLE_WP_CRON', true);

Ahora debemos garantizar que las tareas programadas se ejecuten. El proceso es el mismo, con variaciones cosméticas dependiendo de nuestro hosting. Si usamos CPanel, Plesk o un gestor similar tendremos un acceso al gestor de crons (Tareas programadas)

cron-manager

Añadir el comando es fácil. Además de las configuraciones más comunes, tendremos total libertad para programar la frecuencia que consideremos más adecuada. Ejecutar el cron cada 15 minutos debe ser suficiente en la mayoría de los casos. 

Si no disponemos de un panel visual, pero podemos acceder por SSH (algo habitual si hemos instalado nuestro propio VPS desde cero) editaremos el crontab del sistema o del usuario del servidor web y añadiremos la linea.

*/15 * * * * comando-para-ejecutar-wp-cron > /dev/null 2>&1

En este ejemplo establecemos la programación cada 15 minutos. Aquí tenemos un breve resumen de las opciones y comandos disponibles y para una explicación más detallada tenemos a nuestra disposición el manual de cron para Linux.

El final de la línea es para descartar cualquier salida del comando.

Variantes del comando

Podemos utilizar diferentes versiones del comando. Una que posiblemente funcione en cualquier instalación es:

wget -q "https://dominio.com/wp-cron.php?doing_wp_cron"

donde sustituimos https://dominio.com por la url correspondiente a nuestra instalación. Con este comando simulamos la activación mediante los mecanismos habituales de WordPress. 

Aunque controlamos la frecuencia de ejecución, al conectarnos mediante el servidor web, seguimos consumiendo una conexión externa y en el caso de tareas de larga duración podemos tener errores de ejecución al sobrepasar el limite de tiempo asignado por el servidor web a los procesos de PHP si el script responsable de la tarea no tiene en cuenta este detalle.

Por suerte wp-cron.php puede ser ejecutado directamente desde la línea de comando, como indica la cabecera del propio archivo. Por tanto podemos utilizar el siguiente comando: 

cd /ruta-a-wordpress; /ruta-a-php/php  wp-cron.php

La ejecución de PHP desde la línea de comandos nos soluciona el posible problema de timeouts y deja libre los procesos de escucha en el servidor. Por este motivo pienso que es la mejor opción si tenemos acceso a ella. 

Lo primero que hacemos es desplazarnos a la carpeta de nuestra instalación de WordPress. Este punto es importante para que wp-cron.php pueda encontrar los archivos auxiliares que necesita para funcionar. 


Otras opciones para gestionar WP-Cron

Si tenemos WP-CLI instalado, dispondremos de algunas opciones adicionales para gestionar el cron en WordPress. Las opciones disponibles son

  • wp cron test - Comprueba si wp-cron funciona correctamente. Hay que tener en cuenta que si tenemos activado DISABLE_WP_CRON la comprobación nos avisará de un error. Es lógico, ya que WP-CLI no tiene acceso al crontab del sistema. Desde su punto de vista la programación está bloqueada. 
  • wp  cron schedule - Nos presenta una lista de las tareas programadas y las diferentes programaciones disponibles
  • wp cron event - Permite programar nuevas tareas, así como ejecutar o eliminar las existentes

Es posible utilizar WP-CLI en el crontab del sistema, la sintaxis del comando (la frecuencia de ejecución es  15 minutos) sería esta

*/15 * * * * cd /ruta-a-wordpress; wp cron event run --due-now > /dev/null 2>&1

Si queremos bloquear totalmente los accesos wp-cron.php desde la web, debemos incluir el siguiente fragmento de código en el functions.php de nuestro tema hijo o en un plugin.

add_action( 'plugins_loaded', function() {
if ( defined( 'DOING_CRON' ) && DOING_CRON && php_sapi_name() != 'cli' )
die();
});

Así nos aseguramos que wp-cron.php se ejecute mediante un acceso directo y reservamos el servidor web a visitantes externos. Pero, hay que tener en cuenta que si usamos este  último truco, no podemos utilizar wget en el crontab.


Conclusiones

Cambiar el cron virtual de WordPress por un cron real del sistema operativo, es algo que debemos hacer si  sí. Siempre saldremos ganando por varias razones.

  1. La programación se ejecutará a la hora prevista, independientemente de las visitas a nuestra web. Eso sí el cron del sistema debe ser debe ejecutarse con una frecuencia mayor que las establecidas en WordPress. 
  2. El impacto sobre nuestro servidor web es menor,  sus recursos se reservan para su función principal: atender las peticiones de nuestros usuarios.
  3. Si tenemos varios sitios web en el mismo servidor, podemos establecer la programación adecuada para evitar solapamientos. Podemos establecer diferentes frecuencias individuales o concatenar las llamadas en un script del shell

Como ejemplo no concluyente aquí está el consumo de recursos de mi servidor 

Pseudo cron de wordpress

Usando el pseudo cron de WordPress

Cron del sistema

Usando el crontab del sistema

En mi caso el consumo de memoria ha disminuido drásticamente. La memoria libre prácticamente se ha duplicado. Antes del cambio de vez en cuando tenía errores de memoria insuficiente. Seguramente ampliaré los recursos del servidor, pero la situación ha mejorado sin lugar a dudas. Ahora puedo planificar el cambio con tranquilidad y seleccionar una opción más adecuada a mis necesidades reales.

Finalmente, hay muchos plugins bastante buenos para gestionar las tareas programadas desde el Escritorio de WordPress. Sin embargo como veremos próximamente en una guía practica, implementar las funciones básicas de monitorización no es complicado. 

Y tu, ¿como gestionas las tareas programadas en tu web?

Tus comentarios y experiencias son bienvenidos 

0 0 votes
Valoración del artículo
Suscribir
Notificar de
guest
0 Comentarios
Inline Feedbacks
View all comments