function _drush_batch_worker

8.0.x batch_6.inc _drush_batch_worker()
8.0.x batch.inc _drush_batch_worker()
6.x batch_6.inc _drush_batch_worker()
6.x batch.inc _drush_batch_worker()
7.x batch_6.inc _drush_batch_worker()
7.x batch.inc _drush_batch_worker()
3.x batch_6.inc _drush_batch_worker()
3.x batch_7.inc _drush_batch_worker()
4.x batch_6.inc _drush_batch_worker()
4.x batch.inc _drush_batch_worker()
5.x batch_6.inc _drush_batch_worker()
5.x batch.inc _drush_batch_worker()
master batch.inc _drush_batch_worker()

Process batch operations

Using the current $batch process each of the operations until the batch has been completed or half of the available memory for the process has been reached.

1 call to _drush_batch_worker()
_drush_batch_command in commands/core/drupal/batch.inc
Initialize the batch command and call the worker function.

File

commands/core/drupal/batch.inc, line 124
Drupal 7 engine for the Batch API

Code

function _drush_batch_worker() {
  $batch = &batch_get();
  $current_set = &_batch_current_set();
  $set_changed = TRUE;

  if (empty($current_set['start'])) {
    $current_set['start'] = microtime(TRUE);
  }
  $queue = _batch_queue($current_set);
  while (!$current_set['success']) {
    // If this is the first time we iterate this batch set in the current
    // request, we check if it requires an additional file for functions
    // definitions.
    if ($set_changed && isset($current_set['file']) && is_file($current_set['file'])) {
      include_once DRUPAL_ROOT . '/' . $current_set['file'];
    }

    $task_message = '';
    // Assume a single pass operation and set the completion level to 1 by
    // default.
    $finished = 1;

    if ($item = $queue->claimItem()) {
      list($function, $args) = $item->data;

      // Build the 'context' array and execute the function call.
      $batch_context = array(
        'sandbox' => &$current_set['sandbox'],
        'results' => &$current_set['results'],
        'finished' => &$finished,
        'message' => &$task_message,
      );
      // Magic wrap to catch changes to 'message' key.
      $batch_context = new DrushBatchContext($batch_context);

      // Tolerate recoverable errors.
      // See https://github.com/drush-ops/drush/issues/1930
      $halt_on_error = drush_get_option('halt-on-error', TRUE);
      drush_set_option('halt-on-error', FALSE);
      call_user_func_array($function, array_merge($args, array(&$batch_context)));
      drush_set_option('halt-on-error', $halt_on_error);

      $finished = $batch_context['finished'];
      if ($finished >= 1) {
        // Make sure this step is not counted twice when computing $current.
        $finished = 0;
        // Remove the processed operation and clear the sandbox.
        $queue->deleteItem($item);
        $current_set['count']--;
        $current_set['sandbox'] = array();
      }
    }

    // When all operations in the current batch set are completed, browse
    // through the remaining sets, marking them 'successfully processed'
    // along the way, until we find a set that contains operations.
    // _batch_next_set() executes form submit handlers stored in 'control'
    // sets (see form_execute_handlers()), which can in turn add new sets to
    // the batch.
    $set_changed = FALSE;
    $old_set = $current_set;
    while (empty($current_set['count']) && ($current_set['success'] = TRUE) && _batch_next_set()) {
      $current_set = &_batch_current_set();
      $current_set['start'] = microtime(TRUE);
      $set_changed = TRUE;
    }

    // At this point, either $current_set contains operations that need to be
    // processed or all sets have been completed.
    $queue = _batch_queue($current_set);

    // If we are in progressive mode, break processing after 1 second.
    if (drush_memory_limit() > 0 && (memory_get_usage() * 2) >= drush_memory_limit()) {
      drush_log(dt("Batch process has consumed in excess of 50% of available memory. Starting new thread"), LogLevel::BATCH);
      // Record elapsed wall clock time.
      $current_set['elapsed'] = round((microtime(TRUE) - $current_set['start']) * 1000, 2);
      break;
    }
  }

  // Reporting 100% progress will cause the whole batch to be considered
  // processed. If processing was paused right after moving to a new set,
  // we have to use the info from the new (unprocessed) set.
  if ($set_changed && isset($current_set['queue'])) {
    // Processing will continue with a fresh batch set.
    $remaining = $current_set['count'];
    $total = $current_set['total'];
    $progress_message = $current_set['init_message'];
    $task_message = '';
  }
  else {
    // Processing will continue with the current batch set.
    $remaining = $old_set['count'];
    $total = $old_set['total'];
    $progress_message = $old_set['progress_message'];
  }

  $current = $total - $remaining + $finished;
  $percentage = _batch_api_percentage($total, $current);
  return ($percentage == 100);
}