Pull to refresh

Пример использования Batch

Reading time 2 min
Views 31K
Допустим, необходимо проделать некую операцию с большим количеством node и времени выполнения скрипта не хватает.
В этом случае можно увеличить время выполнения скрипта следующим образом:
set_time_limit($time); // $time in seconds

Это, мягко говоря, не самое правильное решение.
В этом случае на много правильнее реализовать это через batch.


Пользоваться batch крайне просто. Сейчас приведу пример.

Допустим мы имеем массив из nid:
Copy Source | Copy HTML
  1. $nids = array(
  2.   0 => nid,
  3.   1 => nid,
  4.   …
  5.   n => nid,
  6. );


Также есть некая функция, которая работает с этим массивом.
Для примера просто будем загружать и сохранять node.

Copy Source | Copy HTML
  1. function batch_example_nodes_resave($nids = array()){
  2.   foreach ($nids as $nid){
  3.     if (is_numeric($nid)){
  4.       $node = node_load($nid);
  5.       node_save($node);
  6.     }
  7.   }
  8. }


Теперь описываем функцию с batch.
Будем делить массив $nids на части (по 5 эллементов) и отправлять в batch_example_nodes_resave()

Copy Source | Copy HTML
  1. function batch_example_nodes_resave_batch($nids = array()){
  2.   $operations = array();
  3.   while($nids){
  4.     $nids_part = array_splice($nids,  0, 5);
  5.     $operations[] = array('batch_example_nodes_resave', array($nids_part ));
  6.   }
  7.   $batch = array(
  8.     'title' => t('Resave nodes'),
  9.     'operations' => $operations,
  10.   );
  11.   batch_set($batch);
  12.   batch_process();
  13. }


Теперь достаточно передать наш массив в batch_example_nodes_resave_batch() и посмотреть, как все красиво работает :)

p.s. Прошу прощения за дабл пост, хабр чето вообще себя не важно чувствует…
Tags:
Hubs:
+25
Comments 16
Comments Comments 16

Articles