cron
Cómo funciona el cron en Drupal
Carlos — Mar, 12/08/2008 - 23:14
Ged de Drupalweb me lanza el reto de explicar un poco cómo funciona el cron en Drupal. En realidad lo hizo hace unos días pero no lo vi hasta ayer, pero bueno, supongo que más vale tarde que nunca.
Realmente pide saber más sobre el cron y sobre el ping, pero yo he escogido el cron. El ping se lo dejo a Pedro o a Daniel o a quien quiera.
Cómo introducción estaría bien saber que es el cron (de la wikipedia):
En el sistema operativo Unix, cron es un administrador regular de procesos en segundo plano (demonio) que ejecuta programas a intervalos regulares (por ejemplo, cada minuto, día, semana o mes). Los procesos que deben ejecutarse y la hora en la que deben hacerlo se especifican en el archivo crontab.
Cron se podría definir como el "equivalente" a Tareas Programadas de Windows. Los usuarios habilitados para crear su archivo crontab se especifican en el archivo cron.allow. De manera análoga, los que no lo tienen permitido figuran en /etc/cron.d/cron.deny, o /etc/cron.deny, dependiendo de la versión de unix.
Es decir, que es un programa que ejecutará en los intervalos que le digamos un determinado programa. Esto se hace usando el comando crontab -e o desde el panel de control de tu hosting. Lo siguiente es una linea del cron:
30 * * * * /home/carlos/mi_script
Esto hará que cuando lo minutos sean igual a 30, las horas cualquiera, el día cualquiera y el mes cualquiera se ejecuta /home/carlos/mi_script. Es decir, que el primer número indica los minutos, el segundo las horas, el tercero los días, el cuarto los meses y el quinto el día de la semana (me olvidé de este, gracias FeKuLa). Un asterisco vale de comodín o podemos poner más de un valor usando un coma cómo separador. Por ejemplo el siguiente código que ejecutará mi_script cuando los minutos sean 0, 15, 30 o 45, es decir, cada cuarto de hora:
0,15,30,45 * * * * /home/carlos/mi_script
Vale, ¿y ahora cómo unimos esto al cron de Drupal? Es fácil, en Drupal hay un archivo llamado cron.php (curioso el nombre) que es el que hemos de configurar para que el cron lo ejecute, por lo que añadiremos algo así:
0 * * * * wget -O - -q -t 1 http://www.midominio.com/cron.php
Con esto se ejecutará cada hora. Si estás en un hosting compartido es mejor poner un minuto diferente de 0, uno que no sea normal, así cuando se ejecute no habrá otros programas ejecutados por el cron e irá más rápido (o por lo menos no ayudará a sobrecargarse el servidor, algo más habitual de lo normal). Dependiendo de nuestra web tal vez sea necesario que se ejecute más o menos veces. También es posible que wget no esté en el path por lo que habrá que poner la ruta completa, normalmente suele ser /usr/bin/wget.
Recuerda que esta linea no se añade en el cron.php de Drupal, se ha de añadir usando el comando crontab -e (sólo para expertos) o usando tu panel de control de hosting.
Ahora sólo falta por saber que hace el fichero cron.php aunque primero hay que saber lo que es un hook en drupal. En la documentación de Drupal pone (traducido más o menos por mi):
Permite a los módulos interactuar con el núcleo de Drupal.
El sistema de módulos de Drupal esta basado en el concepto de "hooks". Un hook es una función de PHP a la que llamamos foo_bar(), donde "foo" es el nombre del módulo (cuyo nombre de archivo es también foo.module) y "bar" es el nombre del hook. Cada hook tiene una serie de parámetros predefinidos y el tipo de variable que devuelve.
Para ampliar Drupal, un módulo simplemente implementa un hook. Cuando Drupal desea permitir la intervención desde los módulos determina que módulos implementan un hook y ejecuta ese hook en los módulos habilitados que lo implementen.
Ummm, creo que no está demasiado bien explicado o lo he traducido mal. Intentaré explicarlo con mis propias palabras. Un hook no es más que una función de un módulo pero que se llama de una manera especial. Por ejemplo, si estoy haciendo un módulo que se llama carlosrincon y quiero que ese módulo tenga un bloque con mi foto tendré que usar el hook_block por lo que llamaré a mi función carlosrincon_block.
Entonces cuando Drupal quiera ver todos los bloques disponibles mirará de entre todos los módulos habilitados las funciones que se llamen nombremodulo_block y encontrará el mio.
Pues todo esto venía por que existe el hook_cron que cuando el fichero cron.php se ejecuta Drupal busca en todos los módulos que hayan implementado el hook_cron y ejecuta el hook. Así por ejemplo la búsqueda indexa el contenido cada vez que se ejecuta el cron.php por que tiene una función que se llama search_cron()
<?php
function search_cron() {
// We register a shutdown function to ensure that search_total is always up
// to date.
register_shutdown_function('search_update_totals');
// Update word index
foreach (module_list() as $module) {
module_invoke($module, 'update_index');
}
}
?>
Bueno, espero poder haber aclarado las dudas pero si hay alguna más para eso están los comentarios.
Comentarios recientes
hace 3 años 6 semanas
hace 3 años 39 semanas
hace 3 años 47 semanas
hace 4 años 3 días
hace 4 años 8 semanas
hace 4 años 8 semanas
hace 4 años 9 semanas
hace 4 años 10 semanas
hace 4 años 10 semanas
hace 4 años 11 semanas