Napi api: Batch API

The spam filter installed on this site is currently unavailable. Per site policy, we are unable to accept new submissions until that problem is resolved. Please try resubmitting the form in a couple of minutes.
Kategória: 
Leírás
Napi api: Batch API

Well, talán harmadjára futok össze a batch apival, és még mindig nem volt zökkenőmentes a barátság, szóval amíg az a betyár sok elem leszalad, amin dolgoztam, levésem gyorsan a tudnivalókat, hogy legközelebb már ne kelljen megint mindenre rájönni.

No akkor batch api:

A batch kötegelt feldolgozást jelent. Drupalon belül úgy is mondhatjuk, hogyha egyszerre annyi adattal kell dolgozni, ami túlnő egy oldalletöltés korlátjain, akkor kell a batch apihoz nyúlni. A képet megnézve valószínű egyébként, hogy egyből leesik, a Drupal melyik részéről is van szó.

Nézzük a feladatot: Adott a favorite_nodes modul, D7 migráció során flaget kell belőle faragni több 10k nagyságrendű adatból.

A batch api maga két fő részből áll. Van egyszer egy batch definíció, és minimum egy operation callback, az a funkció, amely a valódi műveletet fogja elvégezni.

Így néz ki nagyjából egy batch definíció:

[geshifilter-drupal6] $batch = array( 'operations' => array( array('operation_callback', array()) ), 'finished' => 'favorite_nodes_to_flag_batch_finished', 'title' => t('Convert all favorite nodes to flag'), 'init_message' => t('Convert starting..'), 'progress_message' => t('Processed @current out of @total.'), 'error_message' => t('Hmm.. Something could be wrong, sorry, post an issue to module..'), );[/geshifilter-drupal6]

Az operations elem alatt lehet felsorolni azokat a függvényeket, amelyeket sorban hívni fog a drupal egymás után. Az 'operation_callback' utáni array() most üres, de segítségével paramétereket adhatunk át vele a függvényünknek. Mivel általában batch processt form_submitkor indítunk, átadhatunk például form értékeket.

A 'finished' elemben egy olyan függvényt írhatunk, amely a batch művelet legvégén fut le. Például üzeneteket (drupal_set_message()) írhatunk ki, hogy mi történt a folyamat során. Figyi, ez nem array, ebből csak egy van!

Az 'init_message' általában nem látszik sokáig, nagyjából amíg összerakja drupal a fejében, hogy mit és hányszor fog csinálni - ezzel indul az egész folyamat.

Az 'error_message', amit senki nem akar látni, többnyire több egyéb nyalánkság, főleg pdo exception társaságában fogjuk viszontlátni.

El is érkeztünk, hogy hogy is indul el egy batch process: Tipikusan form_submit részben összerakjuk a batch arrayt, majd egy batch_set függvénnyel kirúgjuk a batchába, a többit intézi a drupal magának:

[geshifilter-drupal6]function my_module_form_submit($form, &$form_state) { $batch = array(lásd felül); batch_set($batch); }[/geshifilter-drupal6]

Ezzel elkezdődik az operation része a batchnek. Ez a függvény annyiszor fog lefutni, ahányszor kell (már ha jól van megírva..)
Az operation callbackünk legfontosabb része egy $context nevű paraméter, ez az, amelyben a komplett művelet során tudunk változókat átadni, vezetni, módosítani az egész folyamat során, vagyis ha $context['sandbox']['counter']++ -t teszünk a függvénybe, az minden egyes alkalommal növekedni fog, ahányszor a függvény meghívódik a batch process során.

Ennek a $context paraméternek a következő részeit állítgathatjuk:

$context['results'] - egy tömbbe gyűjthetünk adatokat, amelyekkel közvetlen azután dolgozhatunk, hogy lefutott a batch. Ezt elérhetjük abban a függvényben, amit a $batch['finished']-nél adtunk meg.

$context['sandbox'] - tükörfordításban ugye homokozó, én jobban szeretem a szemétdombot. Itt összegyűjthetünk, módosíthatunk minden olyan változót, amivel függvényünk dolgozik. Például ahogy fentebb is volt már, hogy hányszor futott a process.

$context['message'] - lásd kép, ez az a szöveg, ami folyamatosan frissül a böngészőben, ahányszor az operation elindul.

$context['finished'] - Hogy hány %-nál jár a művelet. Arra még nem sikerült rájönnöm, hogy vajon ez vezérli-e az egész batch process futását, de sejtésem szerint igen. Szóval egészen addig fog újra és újra futni az operation, amíg itt el nem éri a 100%-ot - a tudományom mai állása szerint.

Nézzünk egy ilyen függvényt, és magyarázzunk:

[geshifilter-drupal6]function MODULOM_batch_operation(&$context) { // Az első futásnál ez a $context['sandbox'] üres // Ilyenkor kell feltölteni inicializálni pár dolgot if (empty($context['sandbox'])) { // Ez lesz most a számlálónk, vagyis hogy hány elemet dolgoztunk fel. $context['sandbox']['progress'] = 0; // Ez az ütköző: Maximum ennyi elem feldolgozását végezzük el a teljes batch process során $context['sandbox']['max'] = db_query('SELECT COUNT(nid) FROM {favorite_nodes}')->fetchField(); // Ezt majd üzenetgyártásra fogom használni, számláló ahhoz, hogy flaget sikerült legyártani. $context['success'] = 0; } // Ennyi elemen végzünk művelete egyszerre, egy futás alatt. $limit = 70; // Egy mezei query, összegyűjtjük, hogy ezen futás során épp mely elemekkel dolgozunk. // Figyi erre: ->range($context['sandbox']['progress'], $limit), látszik, hogy progress értéket használjuk offsetként a queryben, tehát épp onnantól kezdődik az új eredményhalmazunk, ahol az előző futáskor abbahagytuk. $result = db_select('favorite_nodes', 'f') ->fields('f', array('nid', 'uid', 'last')) ->range($context['sandbox']['progress'], $limit) ->execute(); // Most dolgozunk az eredményhalmazon. foreach ($result as $row) { // Először növeljük a progresst. $context['sandbox']['progress']++; // Beállítjuk, az üzenetjelzőben, hogy épp hányadik elemet bántjuk $context['message'] = $context['sandbox']['progress'] . ' item processed.'; // Ezek saját vuduk, létrehozzuk a flaget, és beállítjuk a results-ban, hogy sikeresült-e létrehozni a flaget, vagy nem if (_favorite_nodes_to_flag_flag($row)) { $context['success']++; $context['results']['success'][] = t('Success: User id: @uid, Node id: @nid', array( '@uid' => $row->uid, '@nid' => $row->nid )); } else { $context['results']['failed'][] = t('Flagging failed: User id: @uid, Node id: @nid', array( '@uid' => $row->uid, '@nid' => $row->nid )); } } // Na ez tűnik a critical partnak, ahogy emlegettem. Ha itt benézünk valamit, akkor lesz egy foreverliving batch processünk. Szóval figyeljünk, hogy hogyan állítjuk be az ütközőt. if ($context['sandbox']['progress'] != $context['sandbox']['max']) { $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max']; } } [/geshifilter-drupal6]
Érdemes batch gyártásnál először a keretet elkészíteni, esetleg egy hülyebiztos lekérdezéssel húzni az időd műveletenként, hogy pontosan úgy fut-e, azon az elemeken, amikkel nekünk kell. Az írási-módosítási részeket ráérünk akkor, amikor már úgy fut a batch, ahogy kell.

Ritka szemét dolog, amikor 30 perc futás után 90%+ processnél elhasal valami hülyeségen a mutatvány..

Hozzászólások

I benefit from reading your

I benefit from reading your web site. Thanks!

Simply wished to mention I'm

Simply wished to mention I'm just thrilled I came upon your web page.|

Ist es nicht Amyl?

Ist es nicht Amyl?

It's very simple to find out

It's very simple to find out any matter on web as
compared to textbooks, as I found this post at
this website.

amateurcams turnt mich

amateurcams turnt mich richtig !

5vfgdw7j1r

5vfgdw7j1r http://agribiztvonline.com/?option=com_k2&view=itemlist&task=user&id=156... 0rpzc4xguk ejy583l http://www.mipedu.nhc.ac.uk/UserProfile/tabid/106/userId/1481052/Default... yx4f1gl clme56rh3 http://khazovnh.bget.ru/?option=com_k2&view=itemlist&task=user&id=648206... l76zf4 f2dmapg http://catalinchiru.ro/?option=com_k2&view=itemlist&task=user&id=611336b... fotbollströjor miw8c1g
[url=http://www.anti-corruption.ops.go.th/?option=com_k2&view=itemlist&task=user&id=296835]maglie calcio a poco prezzo[/url]

agp5te

Frauen und Geld - zwei Welten

Frauen und Geld - zwei Welten begegnen sich!

Aber mein Schicksal, nicht zu

Aber mein Schicksal, nicht zu wollen, dass ich zu haben das Glück.

Er hielt den lieben langen

Er hielt den lieben langen Tag den Kopf gesenkt und dachte nach.

1985 abgebrochenes Projekt!

1985 abgebrochenes Projekt!

2016 series ratings

2016 series ratings reachedONSet the cost of a $152watch up to $163 and clients will convert away. While you are it accurate which the quick gladness on the bestbase of nearly 100.

Und viele Frauen tun es ihr

Und viele Frauen tun es ihr gleich.

Perfect piece of work you

Perfect piece of work you have done, this website is really cool with great info.

und natürlich gibt es auch

und natürlich gibt es auch eine nacktselfie mit einem nackten blonden Mädchen ….

Unsere heißen Girls sind

Unsere heißen Girls sind schon ganz rammelig und können es kaum erwarten, deinen harten Schwanz der engen Fotze zu spüren.

upxt85key7 fotbollströjor

upxt85key7 fotbollströjor trgia63 iy0xbsz81m maglie calcio 0fi4k7n 3fq170 fodboldtrøjer 59xwgv7 r9jtuho fotballdrakter c5x180g

05h4x2 fotballdrakter barn

05h4x2 fotballdrakter barn b0i4sa 7siyozr4 fodboldtrøjer dner3j6 vkxegy maglie calcio poco prezzo 29n8xze73k 2kqv38jg4f billiga fotbollströjor 6bow9tg

irolmu0q2 billiga

irolmu0q2 billiga fotbollströjor xbmgvshl rs5xa6j fodboldtrøjer børn hdt95cw6 4t5giv maglie del calcio scae4wx6v qcbi4u6hpl fotballdrakter barn o46ga9v2q

uem9z5b fotbollströjor

uem9z5b fotbollströjor 5fet7wn cqodiws3 maglie calcio poco prezzo uak57g4t 5kgsxjmufp billige fotballdrakter vredf3581 ucjy9583 billige fodboldtrøjer n231f64xmb

2013 Zu A Fugitive from the

2013 Zu A Fugitive from the Past habe ich eine Kritik geschrieben, ich poste sie mal, falls dich der Film interessiert: Definitiv ein meisterlich inszenierter Klassiker des Kriminalfilms… Meine Liste für Neueinsteiger würde ungefähr aussehen, wobei ich hier ausschließlich Realfilme aufzähle, da Anime doch eine ganz eigene Welt für sich sind: 1.

I don't usually comment but I

I don't usually comment but I gotta say thanks for the post on this one :D.

Nur gut, dass unser , der

Nur gut, dass unser , der alte Gentleman gerade vorbei fährt und sie ein Stück mit nimmt.

Live Sex mit fetten Telefon

Live Sex mit fetten Telefon Schlampen.

Gеnerally I ԁo not read post

Gеnerally I ԁo not read post oon blogs, buut І ԝish
tо say tһat tһis write-up very compelled me t᧐
tаke а look att and ⅾo s᧐! Үour writing style hhas bеen amazed me.

Тhanks, quitе greɑt article.

I delight in the content on

I delight in the content on your internet site. Kudos!

Great Web site, Maintain the

Great Web site, Maintain the fantastic job. Thank you.|

You've incredible stuff

You've incredible stuff right.

Amazing Web page, Stick to

Amazing Web page, Stick to the excellent job. Appreciate it.|

Much thanks! This is

Much thanks! This is definitely an superb website.

Many thanks very valuable.

Many thanks very valuable. Will certainly share website with my good friends.

Hey there, excellent web page

Hey there, excellent web page you possess presently.

Great looking site. Assume

Great looking site. Assume you did a bunch of your very own html coding.

fotbollströjor barn

fotbollströjor barn

mireene. gamedabong.

malideveloppeur.

sapphirecorp. m2u.

storyboard-books. gtublog.

vytrvalost.

Just simply needed to point

Just simply needed to point out I am just thrilled that i happened in your site!|

Love the site-- very

Love the site-- very individual friendly and whole lots to see!

Love the website-- really

Love the website-- really individual pleasant and lots to see!

I like this site - its so

I like this site - its so usefull and helpfull.

say thanks to so a lot for

say thanks to so a lot for your site it helps a great deal.
Fodboldtrøjer http://www.servicodetraducao.com

Hi, I'm Jerome. I spend too

Hi, I'm Jerome. I spend too much time surfing the web, looking for interesting
articles 'n' stuff. Here's one I hope you like.

infinity-october. 2atalk.

Hozzászólás

A mező tartalma nem nyilvános.
  • Internal paths in double quotes, written as "internal:node/99", for example, are replaced with the appropriate absolute URL or relative path.
  • Engedélyezett HTML elemek: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <del> <img>
  • A webcímek és email címek automatikusan linkekké alakulnak.
  • A sorokat és bekezdéseket a rendszer automatikusan felismeri.
  • Engedélyezett HTML elemek: <a> <blockquote> <br> <cite> <code> <dd> <del> <div> <dl> <dt> <em> <li> <ol> <p> <span> <strong> <ul>
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>, <bash>, <c>, <cpp>, <drupal5>, <drupal6>, <java>, <javascript>, <mysql>, <php>, <python>, <ruby>, <sql>. The supported tag styles are: <foo>, [foo].
  • Minden email cím át lesz alakítva ember által olvasható módon, vagy (ha a JavaScript engedélyezett) ki lesz cserélve kattintható, de biztonságos hivatkozásra.