4

I am working on Drupal 8 and batch API. I created the batch api calling importingmatch and it should automatically importing every 1 hour.

My solution is use Drush for make it works without the browser, but I don't know how I can get the batch id.

Here is my code about the Batch API:

// Set up the Batch API
    $batch = array(
        'operations' => $operations,
        'finished' => 'importingmatch_finishedBatch',
        'title' => t('Import match'),
        'init_message' => t('Starting import match.....'),
        'progress_message' => t('Completed @current step of @total.'),
        'error_message' => t('Import match deletion has encountered an error.'),
    );

    batch_set($batch);

Currently, this batch is runing perfect if I access from my PC. Url: www.mysite.com/importing_match I am not sure how make it working from the server Centos with Drush, I need the batch ID for execute: Drush batch-process

UPDATE: - Interesting with the Command for Drush, I created custom Command from my module. Following from here: https://www.chapterthree.com/blog/how-to-create-custom-drush-commands. But it's still not working, it's showing:

The drush command '<name>' could not be found.

I changed from localhost to 127.0.0.1 from the settings.php but it's not helpful. Any idea?

  • Which batch ID are your referring to ? – pbonnefoi Jan 11 '17 at 17:33
  • Create your own drush command to initiate your batch process inside drush.inc of your module. – Ashish Deynap Jan 11 '17 at 19:17
8

Instead of using Cron API you could provide your own custom Drush command and implement Batch API there. And then execute this Drush command using your server's crontab.

Following comes a sample command that implements a batch. Inside module_name.drush.inc put:

function module_name_drush_command() {
  $items = array();
  $items['migrate-batch-list'] = array(
    'description' => 'Migrate import match',
    'examples' => array(
      'drush migrate-batch-list' => 'Migrate import match',
    ),
  );
return $items;
}

function drush_module_name_migrate_batch_list() {
  drush_print('Migrate import match list.');

  $operations = array(...something here you want.);
  $batch = array(
    'operations' => $operations,
    'finished' => 'importingmatch_finishedBatch',
    'title' => t('Import match'),
    'init_message' => t('Starting import match.....'),
    'progress_message' => t('Completed @current step of @total.'),
    'error_message' => t('Import match deletion has encountered an error.'),
  );

  // Initialize the batch.
  batch_set($batch);

  // Start the batch process.
  drush_backend_batch_process();
}

Note: You can run this from terminal as drush migrate-batch-list

8

You don't. Batch API is to do long-running processing with user-interaction.

For cron, you either use queue API or you just process for N seconds/things in your hook_cron() implementation, and in both cases, cron will be calling you repeatedly until it is eventually done.

If you want to process as fast as possible then either use a different queue processing that doesn't run on cron or make a custom script/drush command that you execute separate from cron, so that you don't block other cron jobs.

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.