Navigation
Drupalmodule
Drupalnews und Drupalblogger
Batch-API in Drupal

Falls wer noch nicht weiß wofür man die Batch-API nutzen kann, hier der Versuch zur Erklärung. Mit der Batch-API kann man Aufgaben erledigen, die nicht in einem Request, also einem Seitenaufruf durchgeführt wird, sondern in mehrere aufgeteilt wird.
Welchen Sinn macht das?
Durch diese Aufteilung kann verhindern werden, dass das Abarbeiten der Aufgaben in einem Abbruch seitens des Servers führt, weil die maximale Scriptlaufzeit überschritten wurde. Standardmäßig 30 Sekunden. Oder auch der PHP-Speicher droht überzulaufen und dann abbricht.
Es gibt 3 mir bekannte Anwendungsfälle, wie man diese Batch-Api nutzen kann.
- Durch das Ausführen eines Formulars
- Durch manuelles aufrufen einer URL bsp. Ausführen des Crons (Klick im Statusbericht auf "manuell durchgeführt" oder cron.php)
- Durch maschinelles aufrufen einer URL bsp. Ausführen des Crons (crontab - Server triggert den Cron)
Im 1. Anwendungsfall überprüft Drupal selbst in der Form-Api, ob ein Batch gestartet wurde und zeigt die bekannte UI für Batch-Vorgänge an.
Im 2. Anwendungsfall muss man nur die Funktion batch_process(); aufrufen, die Drupal sonst in der Form-API aufruft.
Im 3. Anwendungsfall muss man Drupal mitteilen, das der Batch-Vorgang nicht im Browser stattfindet und das erledigt mit der Option $batch['progressive'] = FALSE;. Dann wie gehabt Batch-Vorgang anstossen.
Das in einer Funktion gepackt, könnte es so aussehen:
- <?php
- function mymodule_run_batch($form = TRUE) {
- $operations = mymodule_build_batch();
- 'operations' => $operations,
- 'title' => 'Irgendwas',
- 'init_message' => 'Beginne',
- 'error_message' => 'Fehler beim Ausführen',
- 'file' => __FILE__,
- );
- //cron from local maschine
- $batch =& batch_get();
- $batch['progressive'] = FALSE;
- }
- elseif (!$form) {
- //cron by hand
- }
- return TRUE;
- }
- else{
- return FALSE;
- }
- }
- ?>
Beim Aufruf dieser Funktion außerhalb eines Submit-Handlers, muss man dann einfach den Parameter FALSE übergeben.