¿Por qué Drupal cron no se ejecuta con tanta frecuencia como debería?
¿Te ha pasado que configuras un sitio Drupal para un cliente y después del lanzamiento, se quejan porque no están sucediendo cosas importantes?
- La búsqueda no devuelve todos los resultados nuevos que se han creado.
- Las copias de seguridad no se están ejecutando.
- Las caches no se vacían. Se siguen viendo contenidos en sus versiones antiguas ...
- Los logs no se vacían cuando toca.
- entre otros inconvenientes...
Todas estas cosas deberían ejecutarse automáticamente cuando se ejecuta cron (Drupal viene con la capacidad de ejecutar cron automáticamente) a intervalos específicos, como cada 3 horas. Entonces, ¿cuándo se ejecuta realmente cron, si no es en el intervalo especificado?
Configurar cron para que se ejecute cada 3 horas no significa necesariamente que cron realmente se ejecutará cada 3 horas. Esto se debe a que no es realmente automático. Algo necesita activar cron para ejecutarse. Este desencadenante ocurre cuando un usuario visita el sitio. Como parte de la tramitación de la solicitud de página, Drupal verificará por última vez que se haya ejecutado cron y ejecutará cron como parte de la solicitud si es el momento de hacerlo. Si cron está configurado para ejecutarse cada tres horas y han pasado tres horas desde la última vez que se ejecutó, se ejecutará como parte de la solicitud de página para el usuario que llega a la página en ese momento.
Pero, ¿qué sucede si tiene un sitio, aplicación o intranet de Drupal de tráfico extremadamente bajo? Si nadie visita el sitio, cron no se ejecutará. O si un usuario visita el sitio y se ejecuta cron, y otro usuario visita el sitio 2 horas y 59 minutos después, cron no se ejecutará porque aún no han pasado tres horas. Si un tercer visitante visita 3 horas después, se ejecutará cron. Pero eso es casi 6 horas desde la ejecución cron anterior.
Esto funciona bien para webs pequeñas, con pocos cambios de contenido y con pocas tareas cron importantes. El problema es que la mayoría de webs en Drupal son algún tipo de aplicación web con contenido muy dinámico o con tareas cron intensivas.
No es lo mismo un blog personal como esta web que estas leyendo ahora mismo, que un e-commerce donde hay importaciones de productos de forma diaria, o una intranet conectada con una api externa que envía datos de forma periódica, o una web que tiene un buscador avanzado donde se han de indexar datos en ElasticSearch o Solr por ejemplo.
Y como ya te he dicho, estas dependiendo de que tu web tenga suficientes usuarios durante todas las horas del día para poder asegurar que el cron se ejecutará cada poco tiempo.
¿Qué pasa con los sitios con suficiente tráfico?
Por lo tanto, en sitios con poco tráfico, confiar en que cron se ejecute automáticamente es problemático porque los tiempos en que se ejecuta cron serán erráticos. ¿Qué pasa con los sitios que obtienen más tráfico? Deben obtener suficiente tráfico para que cron se ejecute más o menos a tiempo. Pero enfrentarán otro problema: el tiempo que tarda cron en ejecutarse. Debido a que cron se ejecuta como parte de una solicitud de página para un usuario real, puede ralentizar la página para ese usuario.
Solución: no confíes en las ejecuciones cron automáticas
La solución es no confiar en las ejecuciones cron automáticas. En su lugar, puedes configurarlo en el servidor como un trabajo cron. Esto no depende de las solicitudes de página, por lo que siempre se ejecutará a tiempo. Y se ejecutará en segundo plano, por lo que no ralentizará las solicitudes de página para los usuarios.
Esta es la mejor solución, y es como se recomienda usar las tareas cron en Drupal desde hace años.
El problema es que no todos los hostings baratos compartidos permiten configurar tareas cron.
Básicamente hay 2 formas de configurar el cron en un servidor:
- El servidor tiene un panel de control como Cpanel o un panel hecho a medida por la empresa de hosting. Solo has de entrar en ese panel de control y configurar las tareas cron. Normalmente en la tarea cron se especifica la url de Drupal para que haga una llamada CURL a la url que ejecuta el CRON.
- El servidor no tiene un panel de control porque es un servidor dedicado. Le has de pedir a la gente que gestiona el servidor, que han de dar de alta una tarea cron. En un servidor dedicado hay dos formas de hacer una llamada al cron de Drupal:
- Usar una llamada a DRUSH para que ejecute la llamada cron
- Hacer un CURL a la url del cron de Drupal (es el mismo caso que en un hosting compartido)
Yo recomiendo que se use la ejecución DRUSH del cron siempre que se pueda. Esto es porque de esta forma nos saltamos las limitaciones típicas que tiene ejecutar llamadas a urls de php (límite de tiempo de ejecución, límite de memoria, ...). Esto se nota mucho cuando el cron es el encargado de realizar importaciones periódicas de contenido para actualizar algunas páginas de la web.
Desactiva el cron automático de Drupal
Ahora que lo tienes ejecutándose a nivel del servidor, puedes deshabilitar que Drupal ejecute el cron. Simplemente cambia la configuración del cron "Run Cron every" a never/nunca.
Otra opción recomendable es desactivar el módulo de Drupal.
¿Y porque quiero desactivar el "cron automatico" ? Pues como he dicho antes, por rendimiento de la web.
Aunque estés ejecutando el cron a nivel de servidor ... si da la casualidad que antes de que se ejecute desde el servidor, llega un usuario a tu web ... pues el cron se ejecutará en la carga de la página que está mirando ese usuario. Y esto implica que la carga de esa página será mucho más lenta de lo normal para ese usuario en concreto.
Verifica que cron se esté ejecutando realmente.
Espera hasta que el cron se ejecute. Luego regrese a la página de configuración cron. Si se ha ejecutado correctamente, verá que la "Última ejecución" se ha actualizado y muestra el tiempo de que hace poco que se ha ejecutado el cron.
¡Y eso es todo! Cron ahora se ejecutará en segundo plano de acuerdo con los plazos especificados, independientemente de la cantidad de tráfico que reciba su sitio. Y a medida que su sitio crece y obtiene más tráfico, no necesita preocuparse porque el cron desacelere las solicitudes de página.
¿Tienes algún proyecto en mente?
Si quieres hacer algo en Drupal tal vez puedas contratarme.
Ya sea para consultoría, desarrollo o mantenimiento de sitios web Drupal.