Signatur
Beschreibung
Pool ist Teil der pthreads-Erweiterung und ermöglicht die Verwaltung einer Gruppe von Worker-Threads, an die Stackable- bzw. Threaded-Objekte zur Ausführung übergeben werden können. Anstatt für jede Aufgabe einen eigenen Thread zu erzeugen, wird ein fester Vorrat (Pool) an Worker-Threads bereitgehalten, der Aufgaben entgegennimmt und abarbeitet.
Der Pool verteilt eingereichte Aufgaben (Tasks) automatisch auf die verfügbaren Worker. Die maximale Größe des Pools wird beim Erstellen festgelegt. Solange alle Worker beschäftigt sind, werden neue Aufgaben in eine Warteschlange gestellt und beim nächstmöglichen Zeitpunkt abgearbeitet.
Ein typischer Anwendungsfall ist die parallele Verarbeitung vieler unabhängiger Aufgaben, z. B. Bildverarbeitung, API-Anfragen oder Dateioperationen, ohne den Overhead eines neuen Threads pro Aufgabe. Der Pool kann mit einer eigenen Worker-Unterklasse initialisiert werden, sodass gemeinsame Ressourcen (z. B. Datenbankverbindungen) vom Worker-Konstruktor einmalig bereitgestellt werden.
Wichtig: Die pthreads-Erweiterung ist nur für den CLI-Einsatz gedacht und nicht mit dem Standard-Web-SAPI kompatibel. Ab PHP 8 wird pthreads nicht mehr aktiv gepflegt; als moderner Ersatz empfiehlt sich die parallel-Erweiterung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $size Pflicht | int | Maximale Anzahl von Worker-Threads, die der Pool gleichzeitig betreiben soll. |
|
| $class | string | Worker | Name der Worker-Klasse (oder einer Unterklasse), die für die Threads im Pool verwendet werden soll. |
| $ctor | array | [] | Argumente, die an den Konstruktor der angegebenen Worker-Klasse übergeben werden, wenn neue Worker erzeugt werden. |
Rückgabewert
Beispiele
Einfacher Pool mit parallelen Rechenaufgaben
<?php
// Voraussetzung: pthreads-Erweiterung installiert (PHP CLI)
class AdditionTask extends Threaded {
private int $a;
private int $b;
public function __construct(int $a, int $b) {
$this->a = $a;
$this->b = $b;
}
public function run(): void {
$result = $this->a + $this->b;
echo "Ergebnis: {$this->a} + {$this->b} = {$result}" . PHP_EOL;
}
}
// Pool mit maximal 4 Worker-Threads erstellen
$pool = new Pool(4);
for ($i = 1; $i <= 8; $i++) {
$pool->submit(new AdditionTask($i, $i * 2));
}
// Warten, bis alle Aufgaben abgeschlossen sind
$pool->shutdown();
Pool mit benutzerdefinierter Worker-Klasse
<?php
// Benutzerdefinierter Worker, der eine Ressource (z. B. Verbindung) hält
class DatabaseWorker extends Worker {
private string $dsn;
public function __construct(string $dsn) {
$this->dsn = $dsn;
}
public function start(?int $options = null): bool {
// Verbindung beim Start des Workers einmalig aufbauen
echo "Worker startet mit DSN: {$this->dsn}" . PHP_EOL;
return parent::start($options);
}
}
class QueryTask extends Threaded {
private string $query;
public function __construct(string $query) {
$this->query = $query;
}
public function run(): void {
echo "Führe Query aus: {$this->query}" . PHP_EOL;
}
}
// Pool mit 2 DatabaseWorkern, die dieselbe DSN nutzen
$pool = new Pool(2, DatabaseWorker::class, ['mysql:host=localhost;dbname=test']);
$pool->submit(new QueryTask('SELECT * FROM users'));
$pool->submit(new QueryTask('SELECT * FROM orders'));
$pool->submit(new QueryTask('SELECT * FROM products'));
$pool->shutdown();
// Wichtig · Fallstricke
Deprecation-Hinweis: Die pthreads-Erweiterung wird seit PHP 7.4+ nicht mehr aktiv weiterentwickelt und ist mit PHP 8.x nicht kompatibel. Für neue Projekte sollte die parallel-Erweiterung oder ein prozessbasierter Ansatz (z. B. pcntl_fork) verwendet werden.
- Nur CLI:
Poolund pthreads funktionieren ausschließlich im PHP-CLI-Kontext, nicht unter Apache, Nginx oder FPM. shutdown()aufrufen: Nach dem Einreichen aller Aufgaben muss$pool->shutdown()aufgerufen werden, um auf den Abschluss aller Worker zu warten und Ressourcen freizugeben.- Datenweitergabe: Objekte, die an
Threaded-Instanzen übergeben werden, müssen selbstThreadedimplementieren oder serialisierbar sein. Normale PHP-Objekte oder Closures können nicht direkt geteilt werden. - Reihenfolge: Die Reihenfolge der Aufgabenausführung ist nicht garantiert.