Drupal 7: How to implement cron tasks (hook_cron and hook_cron_queue_info) that takes much time

March 18, 2018

Problem Statement

I want certain data to be updated regularly. Cron job is the best place to have such code. The real issue is that the process might take much time that normal cron job's timeout value exceeds.

hook_cron() suggests to put tasks that executes in shorter time or non-resource intensive tasks.

Mine was neither executing in shorter time nor non-resource intensive!

Solution

In this article, I'm going to show how to use cron functionality of drupal to put resource intensive OR CPU intensive tasks.

Drupal provides two hooks:

  • hook_cron
  • hook_cron_queue_info

Create a Module

Create a module, say name: mytestmodule

Create a file: mytestmodule.module

function mytestmodule_cron() {
   $queue = DrupalQueue::get('name-of-my-queue'); //queue name can be any string you want
   $test = array('29102', '1322', '2322'); //some random numbers
   foreach ($test as $t) {
      $queue->createItem($t);
   }
}
function mytestmodule_cron_queue_info() {
   $info['name-of-my-queue'] = array(
      'worker callback' => 'mytestmodule_do_tasks',
      'time' => 60,
   );
   return $info;
}
function mytestmodule_do_tasks($data) {
   //do something with data
   //For each cron run, this function will get called number of times I have created tasks
}

In hook_cron function, I have defined a queue, and put 3 tasks to it. Note: a single task can be to save a node. Here, you should have all the data you require to initiate a task.

In hook_cron_queue_info function, I have defined a callback function which will receive each task separately. And, specified a timeout value in seconds.

My callback function will be called as many number of times, as the number of tasks.

So, in this example, mytestmodule_do_tasks will receive values: 29012, 1322, 2322 independently.

Hope it helps.


Similar Posts

Latest Posts