Comment Batch fonctionne autour du délai d'expiration PHP

9

La documentation Drupal 7 présente l'API Batch en tant que:

Fonctions permettant de répartir le traitement des formulaires sur plusieurs requêtes de page, garantissant ainsi que le traitement ne soit pas interrompu à cause d'un timeout PHP ...

J'ai pris cela pour signifier que Batch gère les problèmes liés au délai d'attente pour le développeur.

Cependant, d'autres publications (par exemple, comment fonctionne l'API batch en interne? ) Impliquent qu'il est de la responsabilité du développeur d'indiquer à Batch la quantité de travail à faire avant d'attendre qu'un autre utilisateur arrive et que Batch soit à nouveau invoqué --- évitant ainsi la temps libre.

Si ce dernier est vrai, je suppose que Batch ne garantit pas que les travaux ne seront pas expirés. Batch offre-t-il des garanties? Est-ce au développeur de deviner combien de batch peut traiter avant la fin du délai?

Je vous remercie!

Grille-pain
la source
3
C'est une sacrée bonne question, merci :-)
Chapabu

Réponses:

5

Batch dit simplement: "Je ferai N nombre de choses (au plus), puis je rafraîchirai la page ... et j'en ferai plus."

Si vous dites faire 5 éléments par tronçon de travail qui prennent 5 secondes chacun, vous seriez d'accord avec la valeur de délai d'expiration php par défaut de 30 secondes.

Si vous dites faire 20 éléments par bloc de travail qui prennent 5 secondes chacun, votre charge de travail par demande est trop élevée et expirera probablement.

Rappelez-vous que lorsque vous êtes en PHP, le cycle de vie d'une page est request in -> response out. Et que votre serveur Web maintient chaque thread en vie pendant une durée limitée. Vous devez contourner ce délai d'expiration - ce que l'API Batch vous aide à faire.

L'exécution de choses à partir de Say Drush, côté serveur en utilisant des modules de communauté tels que Migrate peut vous aider à éviter complètement les délais d'attente si nécessaire.

ÉDITER

Gardez également à l'esprit que chaque demande de page est un bootstrap drupal complet et que l'API Batch reprend là où elle s'était arrêtée. C'est l'une des opérations les plus coûteuses lors de l'utilisation de l'API Batch, en rechargeant drupal tous les N éléments. C'est pourquoi les gens ont travaillé sur des techniques côté serveur pour créer des nœuds, importer du contenu, etc. L'API Batch est idéale pour les tâches simples et répétitives. Mais il a tendance à s'effondrer dans des ensembles de données complexes ou très très volumineux.

tenken
la source
1
Voulez-vous dire que Batch est invoqué à chaque chargement de page; c'est à dire. Batch se réveille pour voir s'il y a des tâches (comme le cron de poorman)? Cela a été suspecté; cependant, je ne comprends pas pourquoi vous avez insisté sur le coût de calcul du processus. Le coût supplémentaire n'est-il pas seulement quelques comparaisons et quel que soit le travail que Batch a dans sa file d'attente ou Batch fait-il quelque chose de spécial comme s'appeler en chargeant une page?
Grille
1
voir la réponse de kiamlaluno ci-dessous. Une page de barre de progression par lots se recharge simplement après X secondes. Si vous chargez Firebug ou Chrome dans l'onglet Réseau et exécutez un travail d'API Batch, regardez les URL et vous verrez simplement la même page appelée avec différents décalages d'éléments et tailles de morceaux. Le coût de calcul de l'amorçage de tout Drupal à chaque demande de page est ÉLEVÉ. L'exécution d'une importation Drush sql charge drupal une seule fois, par exemple. Pour les grands ensembles de données et les problèmes, la surcharge de l'API Batch devient trop élevée.
tenken
3

L'API par lots s'enregistre simplement en _batch_shutdown()tant que fonction d'arrêt avec register_shutdown_function(). Cette fonction enregistre simplement dans une table de base de données l'état actuel du lot en cours d'exécution.
L'API Batch ne fournit aucune garantie que l'opération que vous exécutez n'est pas interrompue au milieu. C'est pourquoi les opérations par lots exécutent normalement des opérations simples comme la lecture d'une ligne de base de données à partir de l'enregistrement d'une table et l'enregistrement d'une ligne de base de données dans une autre table.

kiamlaluno
la source