Quest'oggi volevo condividere con voi un post che avevo scritto l'anno scorso su Drupal.org, utile per chi deve eseguire dei processi batch per aggiornare grosse moli di dati. Per evitare che il processo vada in timeout, invece di eseguire l'aggiornamento su tutto in un unica passata, effettueremo più aggiornamenti su porzioni di dati fino a completamento. Quando si deve lavorare con molti dati la soluzione sta sempre nel concetto di divide et impera.
Qui di seguito vedremo i frammenti più significativi dell'intero codice che potete trovare nel mio post.
Utilizzare la variabile $sandbox
Per partizionare l'insieme di dati da aggiornare dobbiamo tenere traccia di alcune informazioni importanti:
- il numero totale di nodi da aggiornare;
- il numero di nodi elaborati fino ad ora;
- messaggi da visualizzare durante l'esecuzione;
- l'identificativo dell'ultimo nodo aggiornato;
Questi dati vengono memorizzati all'interno della variabile $sandbox
passata come parametro (
per riferimento) alla funzione hook_update_N(&$sandbox)
.
Alla prima iterazione si inizializza la variabile con le informazioni di
partenza nel modo seguente:
Poi ad ogni iterazione successiva, provvederemo ad aggiornare i suoi valori:
Prima di chiudere la funzione, verificheremo se il processo deve terminare
o essere eseguito nuovamente. Per farlo basta confrontare il valore di
$sandbox['progress']
con il numero totale degli elementi da
aggiornare $sandbox['max']
nel seguente modo:
Definire la finestra di elaborazione
Dimenticavo, dovete inoltre impostare l'ampiezza della finestra di elaborazione, cioè il numero di elementi da elaborare ad ogni ciclo. Ecco come:
Bene questo è tutto. Per vedere il codice completo vi rimando alla pagina del post su Drupal.org.