Видать чего то я в использовании 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;
}
?>
Комментарии
После того как batch заканчивает выполнение, он переходит на ту же самую страницу, с которой запустился. Скорее всего, проблема в том, что вы на этой странице не проверяете никаких условий, а просто запускаете batch еще раз. Он выполняется и опять переходит на эту же страницу и т.д.
Возможное решение - запускать batch по сабмиту формы.
Огромное спс за информацию
Условие остановки батча у вас в коде:
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()'),
);
batch_Start()function
{
$batch = array(
'title' => t('Процесс обновления пошел, сиди и жди'),
'operations' => array(
array('update_DB', array()),
),
'finished' => 'finished_callback_to_batch',
);
batch_set($batch);
batch_process();
}
?>
объясните неразумному его ошибку (окромя использования drupal`a без длительного предшествующего обучения)
У вас batch_Start() - php-функция на сервере, а 'onclick' - js-событие в браузере.