-1

Currently, I have a batch process that is triggered on a form submit.

With more detail, I have something like this:

function mymodule_form_submit($form, &$form_state) {
  // call some functions

  $number_of_sets = 5;

  $batch = array(
    'title' => t('Getting data...'),
      'operations' => array(),
      'finished' => 'mymodule_batch_finished',
      'init_message' => t('Starting ...'),
      'progress_message' => t('Processed @current out of @total.'),
      'error_message' => t('An error occurred during processing'),
      'progressive' => TRUE
    );

  foreach (range(0, $number_of_sets - 1) as $i) {
    $batch['operations'][] = array('mymodule_batch', array($cookie, $var1, $var2));
  }     
  batch_set($batch);

  // call a final function
}

This works fine trough the GUI, i.e., manually submiting the form.

But I need to have the possibility to schedule this batch operation or, more correctly, I need to schedule all the code in that form submit.

This is what I've tried:

function mymodule_cronapi($op, $job = NULL) {
    $items['Import Data'] = array(
        'description' => 'Import Data',
        'rule' => '0 * * * *', // every hour
        'callback' => 'mymodule_proccessdata',
    );
    return $items;
}

function mymodule_proccessdata() {
  // call some functions

  $number_of_sets = 5;

  $batch = array(
    'title' => t('Getting data...'),
      'operations' => array(),
      'finished' => 'mymodule_batch_finished',
      'init_message' => t('Starting ...'),
      'progress_message' => t('Processed @current out of @total.'),
      'error_message' => t('An error occurred during processing'),
      'progressive' => TRUE
    );

  foreach (range(0, $number_of_sets - 1) as $i) {
    $batch['operations'][] = array('mymodule_batch', array($cookie, $var1, $var2));
  }     
  batch_set($batch);

  // call a final function
}

So, basically, I call the same code in the form submit in the hook_cronapi. Everything works fine except for the batch operation.

So, it is not possible to call a batch operation with cron?

I've read about using drupal queue but I'm really lost on how to adapt the code I have and I'm concerned that using queue will just schedule the operation and not do it at the precise time, like it's done with the submit.

Any toughts?

EDIT: I tried queue with no success. See below.

function mymodule_cron_queue_info() {
  $queues = array(
    'dothings' => array(
      'worker callback' => 'mymodule_proccessdata',
      'time' => 60*30,
    ),
  );
  return $queues;
}

function mymodule_cron() {
  $import_item = DrupalQueue::get('dothings');
  $import_item->createItem(array());
}
1

Check with drupal_is_cli() if you are running from command line.

If yes, just fire the entire process instead, no need for batch-api as there will be no timeouts.

  • Thanks StryKaizer, apparently if called from hook_cron, there's really no need to use Batch API or queue or anything else. Btw, drupal_is_cli() returns nothing so I'm assuming I'm running from cli? – zephirus Dec 2 '15 at 17:20

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.