Start · Sprachen · PHP · Referenz · gearman_job_status

gearman_job_status

Funktion

Liefert den aktuellen Status eines Gearman-Hintergrund-Jobs anhand seines Job-Handles.

seit PHP 0.5.0 Kategorie: misc

Signatur

gearman_job_status(GearmanClient $client, string $job_handle): array

Beschreibung

gearman_job_status() fragt den Gearman-Server nach dem aktuellen Ausführungsstatus eines zuvor gestarteten Hintergrund-Jobs. Als Eingabe wird das Job-Handle benötigt, das beim Einreihen des Jobs mit GearmanClient::doBackground() oder GearmanClient::doHighBackground() zurückgegeben wurde.

Die Funktion gibt ein Array mit vier Elementen zurück: ob der Job bekannt ist, ob er gerade ausgeführt wird, sowie den Fortschritt als Zähler (Numerator) und Gesamtanzahl (Denominator). Diese Informationen eignen sich besonders für Polling-Mechanismen, bei denen ein Client periodisch den Stand eines lang laufenden Prozesses abfragen möchte, ohne eine persistente Verbindung zu halten.

Die prozedurale Variante gearman_job_status() ist das funktionale Äquivalent zur Methode GearmanClient::jobStatus() der objektorientierten API. In modernen PHP-Anwendungen wird die OOP-Variante bevorzugt, jedoch ist die prozedurale Form in älteren Codebasen verbreitet.

Zu beachten ist, dass der Fortschrittswert nur dann aussagekräftig ist, wenn der Worker die Statusaktualisierungen aktiv über GearmanJob::sendStatus() an den Server übermittelt. Ohne diese Aufrufe im Worker bleiben Numerator und Denominator auf 0.

Parameter

Name Typ Default Beschreibung
$client Pflicht GearmanClient Eine aktive GearmanClient-Instanz, die mit einem Gearman-Server verbunden ist.
$job_handle Pflicht string Das Job-Handle, das beim Einreihen des Hintergrund-Jobs zurückgegeben wurde (z. B. von GearmanClient::doBackground()).

Rückgabewert

Typ
array
Beschreibung

Gibt ein Array mit vier Elementen zurück:

  • [0] (bool): true, wenn der Job dem Server bekannt ist.
  • [1] (bool): true, wenn der Job aktuell von einem Worker ausgeführt wird.
  • [2] (int): Numerator des Fortschritts (z. B. bereits abgearbeitete Einheiten).
  • [3] (int): Denominator des Fortschritts (z. B. Gesamtanzahl der Einheiten).

Beispiele

Hintergrund-Job einreihen und Status pollen

<?php
$client = new GearmanClient();
$client->addServer('127.0.0.1', 4730);

// Hintergrund-Job einreihen
$jobHandle = $client->doBackground('long_running_task', 'payload_data');

if ($client->returnCode() !== GEARMAN_SUCCESS) {
    die('Fehler beim Einreihen des Jobs.');
}

echo "Job eingereicht, Handle: " . $jobHandle . PHP_EOL;

// Periodisch den Status abfragen
do {
    sleep(1);
    $status = gearman_job_status($client, $jobHandle);

    $known    = $status[0] ? 'Ja' : 'Nein';
    $running  = $status[1] ? 'Ja' : 'Nein';
    $numerator   = $status[2];
    $denominator = $status[3];

    echo "Bekannt: {$known} | Läuft: {$running} | Fortschritt: {$numerator}/{$denominator}" . PHP_EOL;

} while ($status[0] || $status[1]);

echo "Job abgeschlossen." . PHP_EOL;
Job eingereicht, Handle: H:hostname:1 Bekannt: Ja | Läuft: Nein | Fortschritt: 0/0 Bekannt: Ja | Läuft: Ja | Fortschritt: 25/100 Bekannt: Ja | Läuft: Ja | Fortschritt: 75/100 Bekannt: Nein | Läuft: Nein | Fortschritt: 0/0 Job abgeschlossen.

Vergleich: prozedural vs. OOP

<?php
$client = new GearmanClient();
$client->addServer('127.0.0.1', 4730);

$handle = $client->doBackground('my_function', 'some_data');

// Prozedurale Variante
$statusProc = gearman_job_status($client, $handle);

// OOP-Variante (bevorzugt in modernem PHP)
$statusOop = $client->jobStatus($handle);

// Beide liefern identische Arrays
var_dump($statusProc === $statusOop); // bool(true)

echo "Job bekannt (OOP):        " . ($statusOop[0] ? 'Ja' : 'Nein') . PHP_EOL;
echo "Job läuft  (prozedural):  " . ($statusProc[1] ? 'Ja' : 'Nein') . PHP_EOL;
bool(true) Job bekannt (OOP): Ja Job läuft (prozedural): Nein

// Wichtig · Fallstricke

Fortschritt nur mit Worker-Unterstützung: Numerator und Denominator bleiben 0/0, wenn der Worker nicht explizit GearmanJob::sendStatus(int $numerator, int $denominator) aufruft. Ohne diesen Aufruf ist nur der Bekannt/Läuft-Status verfügbar.

Job-Handle-Lebensdauer: Nach Abschluss eines Jobs entfernt der Gearman-Server das Handle. Kurz danach liefert gearman_job_status() [false, false, 0, 0]. Das Ende des Jobs sollte daher anhand des Übergangs von bekannt zu unbekannt erkannt werden.

Prozedurale API: Die prozedurale Gearman-Erweiterung gilt als veraltet. Neue Projekte sollten die OOP-API mit GearmanClient::jobStatus() verwenden.