Come funziona il batch attorno al timeout di PHP


9

La documentazione di Drupal 7 introduce l'API Batch come:

Funzioni che consentono di distribuire l'elaborazione dei moduli su più richieste di pagina, garantendo così che l'elaborazione non venga interrotta a causa di un timeout di PHP ...

Ho preso questo per significare che Batch gestisce i problemi relativi al timeout per lo sviluppatore.

Tuttavia, altri post (ad es. Come funziona l'API batch internamente? ) Implicano che è responsabilità dello sviluppatore dire a Batch quanto lavoro fare prima di aspettare l'arrivo di un altro utente e invocare nuovamente Batch --- evitando così tempo scaduto.

Se quest'ultimo è vero, suppongo che Batch non garantisca che i lavori non siano scaduti. Batch offre garanzie? Spetta allo sviluppatore indovinare quanto Batch può elaborare prima del timeout?

Grazie!


3
Questa è una domanda dannatamente buona, grazie :-)
Chapabu,

Risposte:


5

Batch dice semplicemente "Farò N numero di cose (al massimo) e poi farò un aggiornamento della pagina ... e farò di più".

Se dici di fare 5 elementi per pezzo di lavoro che impiegano 5 secondi ciascuno, andresti bene con il valore di timeout php predefinito di 30 secondi.

Se dici di fare 20 articoli per pezzo di lavoro che impiegano 5 secondi ciascuno, il carico di lavoro per richiesta è troppo alto e probabilmente scadrà.

Ricorda quando sei in PHP il ciclo di vita di una pagina request in -> response out. E che il tuo server web mantiene in vita ogni thread per un tempo limitato. Devi aggirare quel timeout - che l'API Batch ti aiuta a fare.

Eseguire roba da dire Drush, lato server utilizzando moduli di community come Migrate può aiutarti a evitare completamente i timeout, se necessario.

MODIFICARE

Inoltre, tieni presente che ogni richiesta di pagina è un bootstrap drupal completo e l'API Batch rimuove da dove era stata interrotta. Questa è una delle operazioni più costose quando si utilizza l'API Batch, ricaricando drupal ogni N. articoli. Ecco perché le persone hanno lavorato sulle tecniche lato server per creare nodi, importare contenuto, ecc. L'API batch è ottima per attività semplici e ripetitive. Ma tende a cadere in insiemi di dati complessi o molto grandi.


1
Stai dicendo che Batch viene invocato ad ogni caricamento della pagina; vale a dire. Batch si sveglia per vedere se ci sono compiti (come il cron di Poorman)? Questo era sospettato; tuttavia, non capisco perché hai enfatizzato il costo computazionale del processo. Il costo aggiuntivo non è solo un paio di confronti e qualunque sia il lavoro di Batch nella sua coda o Batch sta facendo qualcosa di speciale come chiamarsi caricando una pagina?
Tostapane,

1
vedi la risposta di kiamlaluno sotto. Una pagina della barra di avanzamento batch si ricarica semplicemente dopo X secondi. Se carichi Firebug o Chrome nella scheda Rete ed esegui un processo API Batch, osserva gli URL e vedrai semplicemente la stessa pagina chiamata con offset di elementi e dimensioni di blocchi diversi. Il costo di calcolo del bootstrap di tutto il drupal ogni singola richiesta di pagina è ALTO. L'esecuzione di un'importazione Drush sql carica drupal una sola volta, ad esempio. Per insiemi di dati di grandi dimensioni e problemi l'overhead dell'API Batch diventa troppo elevato.
Tenken

3

L'API batch registra semplicemente _batch_shutdown()come funzione di arresto con register_shutdown_function(). Tale funzione salva semplicemente in una tabella di database lo stato corrente del batch in esecuzione.
L'API Batch non fornisce alcuna garanzia che l'operazione che si sta eseguendo non venga interrotta nel mezzo. Questo è il motivo per cui le operazioni batch normalmente eseguono operazioni semplici come la lettura di una riga del database dal salvataggio di una tabella e il salvataggio di una riga del database in un'altra tabella.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.