Start · Sprachen · PHP · Referenz · Pool

Pool

Klasse

Verwaltet einen Pool von <code>Worker</code>-Objekten zur parallelen Ausführung von <code>Stackable</code>-Aufgaben in der pthreads-Erweiterung.

seit PHP 0.9.0 Kategorie: oop

Signatur

class Pool

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

Typ

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();
Ergebnis: 1 + 2 = 3 Ergebnis: 2 + 4 = 6 Ergebnis: 3 + 6 = 9 ... (Reihenfolge kann variieren)

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();
Worker startet mit DSN: mysql:host=localhost;dbname=test Worker startet mit DSN: mysql:host=localhost;dbname=test Führe Query aus: SELECT * FROM users Führe Query aus: SELECT * FROM orders Führe Query aus: SELECT * FROM products

// 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: Pool und 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 selbst Threaded implementieren oder serialisierbar sein. Normale PHP-Objekte oder Closures können nicht direkt geteilt werden.
  • Reihenfolge: Die Reihenfolge der Aufgabenausführung ist nicht garantiert.