El cron de WordPress: tareas en segundo plano sin colapsar nuestro servidor

No soporto perder el tiempo haciendo las mismas tareas una y otra vez. Por eso hemos creado Nelio Content, para que tanto tú como yo seamos más eficientes. ¡Compruébalo!

Si tienes que ejecutar tareas con mucha frecuencia en WordPress, es posible que acabes colapsando tu servidor o recibas timeouts (tu servidor deja de ejecutar tu código porque te has pasado 😱). Por suerte, podemos planificar este tipo de tareas mediante el cron de WordPress. Pero antes de entrar en materia, permíteme explicarte porqué hemos tenido que recurrir a esta funcionalidad en Nelio.

Las analíticas de Nelio Content: simplificando un problema complejo

Si eres nuevo y has llegado hasta aquí de rebote, ¡bienvenido! En Nelio nos dedicamos a crear plugins para WordPress y a tratar de ganarnos la vida con ello. Y hoy te hablaré de Nelio Content, nuestro plugin para ayudarte a mejorar tanto la creación como la promoción de los contenidos de tu web.

Analíticas de Nelio Content.
Analíticas de Nelio Content.

En la versión 1.2.0 del plugin añadimos un apartado de analíticas donde poder comprobar cómo de bien (o de mal 😑) están funcionando tus contenidos. La idea es que puedas ver tanto el desempeño de tus entradas según el número de visitas que tienen como el nivel de participación que han generado en tus redes sociales (cuántos likes tienen en Facebook o LinkedIn, cuántos comentarios han recibido, etc.).

Ya ves que esto es muy fácil de explicar y de entender, pero añadir analíticas conlleva un gran problema a resolver: ¿Cómo consigo tener los datos de las analíticas actualizados sin hacer que mi servidor WordPress salte volando por los aires? Maldita sea, no ha sido fácil 😓.

En un mundo ideal, querrías poder tener los datos actualizados al milisegundo (y si se puede al nanosegundo), pero siento decirte que esto es imposible. Antes de empezar a programar como locos, el equipo de Nelio nos sentamos a discutir qué tenía sentido hacer con las analíticas. Como siempre, había dos opciones sobre la mesa:

  1. Cada vez que un visitante visita una página o entrada, guardamos la visita en la base de datos para que cuente como un +1 en el número total de visitas de ese contenido.
  2. Accedemos a esa información a través de un servicio externo, como Google Analytics.

Si usas Nelio Content, ya sabrás que la opción escogida ha sido la segunda. Entre otras, las principales razones han sido estas:

  • Guardar la información de visitas en el propio WordPress es una pesadilla. Si tienes una web con mucho tráfico estarás comprometiendo su rapidez por culpa de tener la base de datos colapsada haciendo escrituras constantemente. ¡Mala idea!
  • Guardar esta información en el cloud tiene un coste que tendríamos que repercutir a nuestros clientes, pero nos gustaría que las analíticas las pudiera consultar todo el mundo. La primera opción sigue sin ser viable.
  • Si la información de visitas la guardamos nosotros (en la instalación del cliente o en el cloud, da igual), esto quiere decir que nuestros usuarios no van a poder tener datos reales hasta que no pase un tiempo. Si hoy instalas Nelio Content, no vas a tener datos más o menos fiables hasta que no lleves por lo menos unas semanas recogiendo información. Esto no es útil ni para nosotros (sí, somos los primeros en usar Nelio Content y unos de los clientes más exigentes 😊) ni para nuestros usuarios.
  • Si la mayoría de webs ya están haciendo tracking de esta información con herramientas externas especializadas, ¿vamos a reinventar la rueda? No tiene demasiado sentido.

Visto esto, decidimos utilizar la API de Google Analytics para obtener esta información. Ahora bien, seguimos teniendo el problema de cuándo actualizar los datos. Y es que hacer una consulta cada vez a Google Analytics para que nos devuelva la información de visitas no es demasiado recomendable.

Además, también tenemos las analíticas de participación en redes sociales, que no podemos calcular cada vez porque algunas APIs tienen restricciones del número de llamadas que se pueden hacer en un cierto periodo de tiempo (si, te estoy mirando a ti, Facebook 😞).

Por tanto, debemos tener esta información pre-calculada en la base de datos del cliente, pero actualizarla sólo cada cierto tiempo y sólo si tiene sentido. Si lo hacemos cada minuto, estaremos petando la base de datos y el servidor de WordPress, por lo que volveríamos a tener una solución que no queremos. Y ojo, tenerla pre-calculada quiere decir que dado una entrada cualquiera sólo tenemos guardado su número total de visitas y participación. Repito: sólo guardamos datos agregados, no el tracking individual.

Por lo tanto, el espacio adicional que ocupamos en la base de datos del cliente es ínfimo (unos simples postmetas más, que automáticamente eliminamos si desactivas el plugin y así nos lo indicas en ese momento).

Volviendo al tema de actualizar las analíticas sólo cada cierto tiempo y sólo si tiene sentido, lo que finalmente hemos acabado implementando ha sido lo siguiente:

  1. Permitir a los usuarios que calculen las analíticas de las últimas entradas al activar las analíticas en Nelio Content. De esta forma podrán tener datos válidos desde el primer minuto de uso de nuestro plugin.
  2. Usar el cron de WordPress para re-calcular las analíticas siguiendo el siguiente patrón:
    • Primero, actualizar las analíticas de los contenidos publicados hoy.
    • Una hora más tarde, coger unos cuantos contenidos publicados hace un mes y actualizar sus estadísticas.
    • Una hora más tarde, coger unos cuantos contenidos publicados hace más de un mes y actualizar sus estadísticas.
    • Una hora más tarde, coger unos cuantos contenidos del top de analíticas y actualizar sus valores.
    • Una hora más tarde, volver a empezar el patrón desde el principio.
  3. Dar la opción a los usuarios para que puedan actualizar la información en un momento dado en los ajustes de Nelio Content. Esto es útil para los usuarios más exigentes que en un instante concreto quieren iniciar ellos mismos el proceso de re-cálculo.

Como ves, sólo estamos ejecutando el proceso cada hora, y en cada ejecución sólo re-calculamos las analíticas de un número muy reducido de contenidos, con lo que la carga del servidor no se ve afectada y seguimos respetando los límites de las APIs de redes sociales.

Además de esto, la selección de contenidos a re-calcular se hace con cabeza. Para cada contenido se guarda la fecha de la última vez en que se re-calcularon las estadísticas, y es este valor el que nos permite ordenar las entradas para ir actualizando las que tengan datos más antiguos.

Puede parecer un poco locura, pero la verdad es que funciona bastante bien. Si tenemos en cuenta que cuando publicamos un nuevo contenido, el caso habitual es que durante el primer día de vida sea cuando más visitas, comentarios y actividad en redes sociales hay, todo el patrón de actualización que te he explicado antes tiene sentido.

En Nelio Content actualizamos más las entradas más nuevas y también las más relevantes (que copan el top del ranking), pero sin olvidarnos del resto de tus contenidos.

¿Y cómo funciona el cron de WordPress?

Cada vez que se carga una página en WordPress (ya sea una entrada, tu página principal o cualquier otro contenido accesible mediante una URL en WordPress), se comprueba una lista de funciones programadas para ver si hay que ejecutarlas o no. Esto lo hace wp-cron.php, y lo mejor de todo es que es asíncrono, con lo que la carga de esa página no se ve afectada.

En WordPress podemos programar dos tipos de tareas con el cron:

  • Tareas que se ejecutan una sola vez en un instante predeterminado, como por ejemplo, publicar una entrada planificada para el jueves a las 10h de la mañana.
  • Tareas recurrentes. Son tareas que se han de ejecutar cada cierto tiempo, como por ejemplo comprobar si hay actualizaciones de plugins o temas.

Para programar una tarea en un instante predeterminado, sólo has de hacer esto:

De esta manera ejecutarás la función my_task() una hora después del momento en el que ejecutes este código (lo puedes probar poniéndolo en tu functions.php, por ejemplo). Mírate la información en el Codex sobre la función wp_schedule_single_event.

Y para programar tareas recurrentes, aquí te dejo el ejemplo para crear una tarea que se ejecuta cada hora:

De nuevo, los detalles los tienes en el Codex para la función wp_schedule_event. Es muy sencillo, créeme. Y esto es sólo lo básico, pero te puede servir para iniciarte en el tema del cron de WordPres. Si quieres un tutorial más detallado te dejo este artículo de SitePoint.

Por cierto, si quieres ver qué tareas tienes programadas en tu WordPress, lo puedes hacer instalando el plugin WP Control. A nosotros nos ha sido de gran utilidad para poder hacer las pruebas durante el desarrollo de las analíticas de Nelio Content.

Además del cron de WordPress, tienes otras opciones disponibles para ejecutar tareas en segundo plano en WordPress. Las más populares son estas dos:

Ambas son librerías que te van a proporcionar opciones más complejas que las que encontrarás con el cron de WordPress, pero te recomiendo que les eches un ojo porque puede que se ajusten más a tus necesidades concretas.

Conclusiones finales

Si has llegado al final de esta entrada, espero que te haya parecido interesante entender que detrás de una funcionalidad concreta siempre hay un montón de trabajo. Además, la mayor parte de este trabajo es discutir/decidir cómo hacer las cosas, más que realmente ponerte a hacerlas.

El desarrollo de plugins para WordPress tiene su intríngulis. Y si no tienes la experiencia necesaria puedes hacer destrozos increíbles. Imagínate que hubiéramos optado por actualizar analíticas por cada visita. Es lo más fácil, pero de haberlo hecho hubiéramos tumbado instalaciones WordPress a todo trapo.

Y lo más importante de todo es que busques información e intentes asegurarte de que la opción escogida es la mejor (o por lo menos la menos mala). Para ello, tienes múltiples recursos, como el Slack de la comunidad donde poder compartir con otros compañeros tus dudas más complejas (siempre que los conozcas de antemano; ojo, no es un foro de soporte, no abuses) o el propio Handbook de desarrollo de plugins.

Recuerda, finalmente, que siempre es un placer que me dejes un comentario explicándome qué te ha parecido esta entrada. No te va a llevar nada de tiempo y me harás muy feliz 😍.

Imagen destacada de Markus Spiske.

por

Doctor en Computación por la UPC, con publicaciones en el campo de la minería de datos y de la explotación de información relevante de grandes volúmenes de datos en el campo de la salud. Especializado en el diseño, desarrollo e integración de servicios y aplicaciones web en el cloud. Contribuye muy activamente en la comunidad WordPress participando en meetups, seminarios y WordCamps.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *