Start · Sprachen · PHP · Referenz · GearmanWorker

GearmanWorker

Klasse

Repräsentiert einen Gearman-Worker, der Jobs von einem Gearman-Job-Server entgegennimmt und verarbeitet.

seit PHP 0.5.0 Kategorie: misc

Signatur

class GearmanWorker

Beschreibung

GearmanWorker ist Teil der PHP-Gearman-Erweiterung und ermöglicht es, einen Worker-Prozess zu erstellen, der sich bei einem oder mehreren Gearman-Job-Servern registriert, Funktionen anmeldet und eingehende Jobs asynchron oder synchron verarbeitet. Workers bilden die Verarbeitungsseite des Gearman-Systems, während Clients (GearmanClient) Jobs einreihen.

Ein Worker registriert beliebig viele benannte Funktionen über addFunction() und wartet dann in einer Schleife mit work() auf eingehende Jobs. Sobald ein passender Job eintrifft, wird der zugehörige PHP-Callback aufgerufen. Das Ergebnis kann direkt an den Client zurückgegeben werden.

Typische Einsatzbereiche sind: Hintergrundverarbeitung von E-Mails, Bildverarbeitung, Datenbankoperationen oder jede andere ressourcenintensive Aufgabe, die aus dem HTTP-Request-Zyklus ausgelagert werden soll. Worker können auf beliebig vielen Servern parallel laufen, um horizontale Skalierung zu ermöglichen.

Die Erweiterung setzt eine laufende Gearman-Job-Server-Instanz (z. B. gearmand) voraus und muss über PECL installiert werden (pecl install gearman).

Beispiele

Einfacher Worker, der einen String-Job verarbeitet

<?php
// Worker-Prozess: verarbeitet Jobs der Funktion "reverse"
$worker = new GearmanWorker();

// Job-Server hinzufügen (Standard: localhost:4730)
$worker->addServer('127.0.0.1', 4730);

// Funktion registrieren: kehrt den übergebenen String um
$worker->addFunction('reverse', function (GearmanJob $job): string {
    $workload = $job->workload();
    echo "Verarbeite Job: {$workload}\n";
    return strrev($workload);
});

echo "Worker gestartet, warte auf Jobs...\n";

// Endlosschleife: verarbeitet Jobs, bis der Prozess beendet wird
while ($worker->work()) {
    if ($worker->returnCode() !== GEARMAN_SUCCESS) {
        echo "Fehler: " . $worker->error() . "\n";
        break;
    }
}
Worker gestartet, warte auf Jobs... Verarbeite Job: Hallo Welt

Worker mit Fehlerbehandlung und Timeout

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

// Timeout setzen: work() blockiert maximal 5000 ms
$worker->setTimeout(5000);

$worker->addFunction('thumbnail', function (GearmanJob $job): void {
    $data = json_decode($job->workload(), true);
    $filePath = $data['file'] ?? '';

    if (!file_exists($filePath)) {
        // Job als fehlgeschlagen markieren
        $job->sendFail();
        return;
    }

    // Simulierte Thumbnail-Erzeugung
    echo "Erstelle Thumbnail für: {$filePath}\n";
    // ... Bildverarbeitung ...
    $job->sendComplete('thumbnail_created');
});

$running = true;
while ($running && @$worker->work()) {
    $code = $worker->returnCode();
    if ($code === GEARMAN_TIMEOUT) {
        // Kein Job innerhalb des Timeouts — Heartbeat / Housekeeping möglich
        echo "Timeout – kein Job. Weiter warten...\n";
        continue;
    }
    if ($code !== GEARMAN_SUCCESS) {
        echo "Kritischer Fehler ({$code}): " . $worker->error() . "\n";
        $running = false;
    }
}
Erstelle Thumbnail für: /var/uploads/bild.jpg

// Wichtig · Fallstricke

Wichtige Methoden im Überblick:

  • addServer(string $host, int $port) – Fügt einen Job-Server hinzu.
  • addServers(string $servers) – Fügt mehrere Server als kommagetrennte Liste hinzu.
  • addFunction(string $name, callable $callback, mixed $context, int $timeout) – Registriert eine verarbeitbare Funktion.
  • work() – Blockiert und verarbeitet genau einen Job; Rückgabe false bei Fehler oder Timeout.
  • setTimeout(int $timeout) – Setzt den Timeout für work() in Millisekunden.
  • returnCode() – Gibt den letzten Gearman-Rückgabecode zurück (z. B. GEARMAN_SUCCESS, GEARMAN_TIMEOUT).
  • unregister(string $name) / unregisterAll() – Hebt Funktionsregistrierungen auf.

Stabilitätshinweis: Worker sollten als eigenständige CLI-Prozesse betrieben und z. B. mit supervisord oder systemd überwacht werden, da ein nicht abgefangener Fehler den Prozess beenden kann.

Ressourcen: Lange laufende Worker-Prozesse sollten regelmäßig auf Speicherlecks geprüft werden. PHP gibt Speicher bei zirkulären Referenzen erst beim GC-Lauf frei.