Drupal 7 tip: Cron queues

Posted by: 
Dominique De Cooman

Wanneer je in drupal 6 dingen wilde behandelen op cron moest je vaak een tabel creëren om dingen in op te slaan die later verwerkt moesten worden door een cron job of je gebruikte hooguit de http://drupal.org/project/job_queue.

In drupal 7 kunnen we cron queues gebruiken. Wat doet het? Het helpt je bij het opslaan van dingen die later door cron moeten worden verwerkt.

Hoe moet je het implementeren?

We maken bijvoorbeeld organische groepen die we gebruiken als vervanging in ons systeem. We willen deze sites vullen met standaard content. Dus als het is gemaakt willen we niet dat de gebruiker moet wachten op het genereren van inhoud of nog erger hem het proces laten onderbreken. Daarom hebben we een cron queue om het werk te doen.

We moeten een hook_cron_queue_info() invoeren om durpal op de hoogte te brengen dat er een queue type bestaat. Dit definieert een werker.

<?php
function so_schoolsite_cron_queue_info() {
  
$queues['so_school_site'] = array(
    
'worker callback' => 'so_schoolsite_create_default_site_content',
    
'time' => 60,
  );
  return 
$queues;
}
?>

We definiëren de werker die onze subsite zal opvullen met standaard content.

<?php
function so_schoolsite_create_default_site_content($item) {
  
module_load_include('inc''dfc''/imports/migrate/schoofiches');
  if (
$item['gid'] && $item['nid']) {
    
$website_node node_load($item['gid']);
    
dfc_parse_schoolfiche_set_website_menu_items($website_node);

    
//Group default content creation
    
dfc_migrate_content_school_pages($website_node);
    
dfc_migrate_content_school_project($website_node); //generate default projects
    
dfc_migrate_content_school_photoalbum($website_node);
    
dfc_migrate_content_school_news($website_node);
    
dfc_migrate_content_school_calendar($website_node);

    
$website_node->field_status['und'][0]['value'] = 1;
    
    
$website_node->og_menu 1;
    
node_save($website_node);
    
    
watchdog('so_schoolsite''Default content for site gid:"%gid" (schoolfiche:"%nid") is created', array('%gid' => $item['gid'], '%nid' => $item['nid']));
  }
}

?>

Uiteindelijk willen we onze queue zo maken dat cron het kan oppikken.

<?php
/**
 * Implements hook_node_insert().
 * @param type $node 
 */
function so_schoolsite_node_insert($node) {
  if (
$node->type == 'so_school_schoolwebsite' && !isset($node->so_import)) {
    if (isset(
$node->field_schoolfiche_ref['und'][0]['nid']) && $node->field_schoolfiche_ref['und'][0]['nid']) {
      
$queue DrupalQueue::get('so_school_site');
      
$element = array('gid' => $node->nid'nid' => $node->field_schoolfiche_ref['und'][0]['nid']);
      
$queue->createItem($element);
    }
    else {
      
drupal_set_message(t('So_schoolsite has no reference to fiche please contact support'), 'error');
    }
  }
}
?>

Conclusie:
Gebruik dit cron queue systeem om taken op de achtergrond af te handelen.

Reactie toevoegen