Как остановить batch?

Главные вкладки

Аватар пользователя fastnabus fastnabus 15 августа 2011 в 15:20

Видать чего то я в использовании batch не уразумел, есть шмат кода который из ЕХСЕ-ля тянет в БД данные, чтобы обойти ограничение по Тайм-ауту начал пытаться использовать batch.
Вроде бы мой основной код работает и заносит данные в БД, но вот сам batch зацикливается и начинает работать вечно.
Объясните где нужно и чего поправить, чтобы он останавливался по прохождению определенного кол-ва итераций

<?php$batch = array(
  'title' => t('Процесс обновления пошел, сиди и жди'),
  'operations' => array(
        array('update_DB', array()),
        ),
  'finished' => 'finished_callback_to_batch',
);
batch_set($batch);
batch_process();

function update_DB(&$context)
{
    

        if (empty($context['sandbox'])) 
        {
            $context['sandbox']['progress'] = 0;
            $context['sandbox']['current_item'] = 4;
            $context['sandbox']['max'] = 30;//значение этого поля на что-то хоть влияет?
        }
        $limit = 10;

        for ($i=0; $i<$limit;$i++ )
        {

                       /*здесь собственно шмат кода который берет данные из excel`я и заносит в БД
                         работает вполне хорошо
                         */
            $context['sandbox']['progress']++;
        }
            
        if ($context['sandbox']['progress'] != $context['sandbox']['max']) 
            $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
}

function finished_callback_to_batch($success, $results, $operations) 
{
  if ($success) 
  {
    $message = format_plural(count($results), 'One post processed.', 'count posts processed.');
  }
  else 
  {
    $message = t('Finished with an error.');
  }
  drupal_set_message($message);
  // Providing data for the redirected page is done through $_SESSION.
  foreach ($results as $result) 
  {
    $items[] = t('Loaded node %title.', array('%title' => $result));
  }
  $_SESSION['my_batch_results'] = $items;
}
?>

Комментарии

Аватар пользователя tonyk tonyk 15 августа 2011 в 16:33

После того как batch заканчивает выполнение, он переходит на ту же самую страницу, с которой запустился. Скорее всего, проблема в том, что вы на этой странице не проверяете никаких условий, а просто запускаете batch еще раз. Он выполняется и опять переходит на эту же страницу и т.д.
Возможное решение - запускать batch по сабмиту формы.

Аватар пользователя Sun-fire Sun-fire 15 августа 2011 в 17:07

Условие остановки батча у вас в коде:

if ($context['sandbox']['progress'] != $context['sandbox']['max'])
$context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];

Скоррее всего $context['sandbox']['progress'] не достигает значения $context['sandbox']['max']. И тогда батч будет зацикливаться. Продебажте значения переменной $context['sandbox']['progress'].

Аватар пользователя fastnabus fastnabus 15 августа 2011 в 18:08

"Sun-fire" wrote:

Опубликовано Sun-fire в пн, 15/08/2011 - 16:07.
Sun-fire

Условие остановки батча у вас в коде:

if ($context['sandbox']['progress'] != $context['sandbox']['max'])
$context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];

Скоррее всего $context['sandbox']['progress'] не достигает значения $context['sandbox']['max']. И тогда батч будет зацикливаться. Продебажте значения переменной $context['sandbox']['progress'].


Судя по всему оно все таки зацикливается из за отсутствия начального условия выполнения (с маха начинает выполняется при загрузке страницы), вот только чтото с ручками у меня совсем беда походу: не могу привертеть к кнопке кнопке событие через Forms API, точнее она вообще на экран не выводится

<?php
$form
['batch_Start_button'] = array(
'#type' => 'button',
'#button_type' => 'button',
'#value' => t('Начать обновление'),
'#attributes' => array('onclick' => 'batch_Start()'),

);
function 

batch_Start()
{
$batch = array(
  
'title' => t('Процесс обновления пошел, сиди и жди'),
  
'operations' => array(
        array(
'update_DB', array()),
        ),
  
'finished' => 'finished_callback_to_batch',
);
batch_set($batch);
batch_process();
}
?>

объясните неразумному его ошибку (окромя использования drupal`a без длительного предшествующего обучения)