Wie Batch um das PHP-Timeout herum funktioniert

9

In der Drupal 7-Dokumentation wird die Batch-API wie folgt eingeführt:

Funktionen, mit denen die Formularverarbeitung auf mehrere Seitenanforderungen verteilt werden kann, um sicherzustellen, dass die Verarbeitung nicht aufgrund eines PHP-Timeouts unterbrochen wird ...

Ich habe dies so verstanden, dass Batch die Timeout-Probleme für den Entwickler behandelt.

Andere Beiträge (z. B. wie funktioniert die Batch-API intern? ) Implizieren jedoch, dass es in der Verantwortung des Entwicklers liegt, Batch mitzuteilen, wie viel Arbeit zu tun ist, bevor auf das Eintreffen eines anderen Benutzers gewartet und Batch erneut aufgerufen wird Auszeit.

Wenn letzteres zutrifft, gehe ich davon aus, dass Batch nicht garantiert, dass Jobs nicht abgelaufen sind. Bietet Batch Garantien? Ist es Sache des Entwicklers, zu erraten, wie viel Batch verarbeitet werden kann, bevor das Zeitlimit überschritten wird?

Vielen Dank!

Toaster
quelle
3
Dies ist eine verdammt gute Frage, danke :-)
Chapabu

Antworten:

5

Batch sagt einfach: "Ich werde (höchstens) N Dinge tun und dann eine Seitenaktualisierung durchführen ... und mehr tun."

Wenn Sie sagen, dass Sie 5 Elemente pro Jobblock ausführen, die jeweils 5 Sekunden dauern, ist der Standard-PHP-Timeout-Wert von 30 Sekunden in Ordnung.

Wenn Sie sagen, dass Sie 20 Elemente pro Jobblock ausführen, die jeweils 5 Sekunden dauern, ist Ihre Arbeitslast pro Anforderung zu hoch und es tritt wahrscheinlich eine Zeitüberschreitung auf.

Denken Sie daran, wenn Sie in PHP sind, ist der Lebenszyklus einer Seite request in -> response out. Und dass Ihr Webserver jeden Thread für eine begrenzte Zeit am Leben hält. Sie müssen dieses Zeitlimit umgehen - was Ihnen die Batch-API hilft.

Wenn Sie beispielsweise Drush auf der Serverseite ausführen und Community-Module wie Migrate verwenden, können Sie bei Bedarf Zeitüberschreitungen vollständig vermeiden.

BEARBEITEN

Denken Sie auch daran, dass jede Seitenanforderung ein vollständiger Drupal-Bootstrap ist und die Batch-API dort beginnt, wo sie aufgehört hat. Dies ist eine der teuersten Operationen bei Verwendung der Batch-API, bei der Drupal alle N Elemente neu geladen wird. Aus diesem Grund haben Benutzer an serverseitigen Techniken gearbeitet, um Knoten zu erstellen, Inhalte zu importieren usw. Die Batch-API eignet sich hervorragend für einfache, sich wiederholende Aufgaben. Es neigt jedoch dazu, entweder in komplexen oder in sehr sehr großen Datensätzen auseinanderzufallen.

Tenken
quelle
1
Wollen Sie damit sagen, dass Batch bei jedem Laden der Seite aufgerufen wird? dh. Batch wacht auf, um zu sehen, ob es irgendwelche Aufgaben gibt (wie das Cron des Armen)? Dies wurde vermutet; Ich verstehe jedoch nicht, warum Sie die Rechenkosten des Prozesses hervorgehoben haben. Sind die zusätzlichen Kosten nicht nur ein paar Vergleiche und was auch immer Batch in seiner Warteschlange hat, oder macht Batch etwas Besonderes, wie sich selbst durch Laden einer Seite aufzurufen?
Toaster
1
siehe kiamlaluno Antwort unten. Eine Batch-Fortschrittsbalkenseite lädt sich nach X Sekunden einfach neu. Wenn Sie Firebug oder Chrome auf der Registerkarte "Netzwerk" laden und einen Stapel-API-Job ausführen, sehen Sie sich die URLs an und Sie sehen einfach dieselbe Seite mit unterschiedlichen Elementversätzen und Blockgrößen. Die Berechnungskosten für das Bootstrapping von Drupal für jede einzelne Seitenanforderung sind hoch. Wenn Sie einen Drush-SQL-Import ausführen, wird Drupal beispielsweise nur einmal geladen. Für große Datenmengen und Probleme wird der Batch-API-Overhead zu hoch.
Tenken
3

Die Batch-API registriert sich einfach _batch_shutdown()als Shutdown-Funktion bei register_shutdown_function(). Diese Funktion speichert lediglich in einer Datenbanktabelle den aktuellen Status des ausgeführten Stapels.
Die Stapel-API bietet keine Garantie dafür, dass der von Ihnen ausgeführte Vorgang nicht in der Mitte unterbrochen wird. Aus diesem Grund führen Stapeloperationen normalerweise einfache Operationen aus, z. B. das Lesen einer Datenbankzeile aus dem Speichern einer Tabelle und das Speichern einer Datenbankzeile in einer anderen Tabelle.

kiamlaluno
quelle