Signatur
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 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;
}
}
// 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ückgabefalsebei Fehler oder Timeout.setTimeout(int $timeout)– Setzt den Timeout fürwork()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.