Start · Sprachen · PHP · Referenz · GearmanJob

GearmanJob

Klasse

Repräsentiert einen Gearman-Job, der von einem Worker empfangen und ausgeführt wird.

seit PHP 0.5.0 Kategorie: misc

Signatur

class GearmanJob

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
}
Empfangener Job-Handle: H:hostname:1 Unique ID: mein-job-42 Eingabedaten: Hallo Welt (Länge: 10)

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.