No desenvolvimento de módulos, sempre há a necessidade de se automatizar alguma atividade repetitiva. Neste caso, o cron do Drupal ajuda na realização de tarefas que devem ser realizadas com uma certa frequência.
Assim como o cron do S.O. que estamos acostumados a usar, temos também o cron da própria plataforma Drupal, que pode ser utilizada quando escrevemos módulos.
Veja neste caso: temos uma lista de RSS cadastrados no banco de dados e queremos varrer a lista de sites a fim de encontrar quais destes sites estão fornecendo novos posts por meio do RSS.
Para realizar esta tarefa, vamos usar o hook hook_cron(). Porém, o hook_cron() serve, em geral, para tarefas de curta duração. Em vez disso, recomenda-se o uso do hook_cron_queue_info() que cria fila de crons.
Vamos criar uma fila de crons, de acordo com a nossa API. Note que a função é chamada a cada 120 segundos.
/**
* Implements hook_cron_queue_info().
*/
function MODULO_cron_queue_info(){
$queues['NOME_DA_FILA'] = array(
'worker callback' => 'NOME_FUNCAO',
'time' => 120,
);
return $queues;
}
Uma vez com a fila implementada, vamos construir a nossa regra do cron();
/**
* Implements hook_cron().
* Setamos o cron baseado no sistema para varrer a
* lista de RSS e cadastrar no banco de dados.
*/
function MODULO_cron(){
$result = db_query('SELECT rssid, urlrss FROM {rss_links}');
$queue = DrupalQueue::get('NOME_DA_FILA');
foreach ($result as $item_rss) {
$queue->createItem($item_rss);
}
}
Por fim, declaramos a nossa função NOME_FUNCAO que irá executar o comando de captura dos rss’ na rede.
/**
* Funcao para 'parsear' o RSS.
* Cada vez que ele entra eh um item de RSS analisado.
* Esse, por sua vez, pode conter N postagens no site.
*
* @object $data
*
*/
function NOME_FUNCAO($data){
$doc = new DOMDocument();
$doc->load($data->urlrss);
foreach ($doc->getElementsByTagName('item') as $node)
{
$itemRSS = array (
'title' => $node->getElementsByTagName('title')->item(0)->nodeValue,
'desc' => $node->getElementsByTagName('description')->item(0)->nodeValue,
'link' => $node->getElementsByTagName('link')->item(0)->nodeValue,
'date' => $node->getElementsByTagName('pubDate')->item(0)->nodeValue
);
$quantidade = db_query('SELECT rsspid, url FROM {rss_posts} WHERE url = :url', array(':url' => $itemRSS['link']));
// ja existe algo na tabela referente a este link. Passa para o proximo
if( $quantidade->rowCount() )
continue;
// inserimos no banco
$nid = db_insert('rss_posts')
->fields(array(
'rssid' => $data->rssid,
'titulo' => $itemRSS['title'],
'conteudo' => $itemRSS['desc'],
'data' => date('Y-m-d'),
'url' => $itemRSS['link']
))
->execute();
}
}
Este é um pequeno exemplo do poder que se tem em mãos com o uso do hook_cron().