Signatur
Beschreibung
GearmanJob ist ein Objekt, das einem Gearman-Worker beim Empfang einer Aufgabe übergeben wird. Es enthält alle relevanten Informationen über den Job – Workload (Eingabedaten), Job-Handle, eindeutige ID sowie Methoden, um Statusmeldungen, Fortschrittsangaben, Warnungen und das Ergebnis an den Client zurückzusenden.
Eine Instanz dieser Klasse wird automatisch als Parameter an den registrierten Callback-Funktionen eines GearmanWorker übergeben, wenn ein Job ausgeführt wird. Der Worker-Entwickler interagiert ausschließlich über dieses Objekt mit dem Gearman-System.
Typische Anwendungsfälle sind: Lesen der Eingabedaten mit workload(), schrittweises Melden von Fortschritten an den Client via sendStatus(), Senden von Zwischenergebnissen per sendData() sowie das Abschließen des Jobs mit einem Rückgabewert über sendComplete().
- Workload: Die vom Client übergebenen Eingabedaten als Byte-String.
- Handle: Eindeutiger Job-Bezeichner im Gearman-System.
- Unique ID: Vom Client vergebene optionale Kennung für den Job.
Beispiele
Worker mit Fortschrittsrückmeldung
<?php
$worker = new GearmanWorker();
$worker->addServer('127.0.0.1', 4730);
$worker->addFunction('reverse', function (GearmanJob $job) {
$workload = $job->workload();
$len = $job->workloadSize();
echo "Empfangener Job-Handle: " . $job->handle() . PHP_EOL;
echo "Unique ID: " . $job->unique() . PHP_EOL;
echo "Eingabedaten: {$workload} (Länge: {$len})" . PHP_EOL;
// Fortschritt melden (aktueller Schritt, Gesamtschritte)
$job->sendStatus(1, 1);
$result = strrev($workload);
// Ergebnis abschließend senden
$job->sendComplete($result);
});
while ($worker->work()) {
// Worker-Schleife
}
Worker mit Daten-Streaming und Fehlerbehandlung
<?php
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction('processChunks', function (GearmanJob $job) {
$data = json_decode($job->workload(), true);
if (!is_array($data)) {
// Warnung senden, Job aber nicht fehlschlagen lassen
$job->sendWarning('Ungültige JSON-Eingabe');
$job->sendFail();
return;
}
$total = count($data);
foreach ($data as $i => $item) {
// Zwischenergebnis streamen
$job->sendData("Verarbeite: " . $item);
// Fortschritt aktualisieren
$job->sendStatus($i + 1, $total);
}
$job->sendComplete('Alle Elemente verarbeitet');
});
while ($worker->work()) {
if ($worker->returnCode() != GEARMAN_SUCCESS) {
break;
}
}
// Wichtig · Fallstricke
Fehlerbehandlung: Ruft man sendFail() auf, wird der Job als fehlgeschlagen markiert. Der Client erhält keine reguläre Antwort mehr. Kombiniere dies stets mit einer Warnung via sendWarning(), um den Grund zu übermitteln.
Reihenfolge: Nach dem Aufruf von sendComplete(), sendFail() oder sendException() sollte keine weitere Kommunikation über das Job-Objekt erfolgen, da der Job bereits abgeschlossen ist.
Binäre Workloads: workload() gibt einen rohen Byte-String zurück. Bei strukturierten Daten empfiehlt sich json_encode()/json_decode() oder Serialisierung.
PECL-Erweiterung: GearmanJob setzt die PHP-PECL-Erweiterung pecl/gearman sowie einen laufenden Gearman-Job-Server voraus.