Parallelität und Multithreading in PHP: Von der Theorie zur Praxis

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Parallelität und Multithreading in PHP: Moderne Ansätze



PHP wird traditionell mit synchroner Codeausführung assoziiert. Moderne Webanwendungen erfordern jedoch die gleichzeitige Verarbeitung mehrerer Aufgaben: vom Dateiupload bis zum Parsing großer Datenmengen. In diesem Artikel werden wir untersuchen, wie Parallelität und Multithreading in PHP mit integrierten und externen Tools implementiert werden können.



Was sind Parallelität und Multithreading?



Parallelität ist die Fähigkeit eines Programms, mehrere Aufgaben "gleichzeitig" auszuführen, indem es zwischen ihnen wechselt. Multithreading ist ein Spezialfall der Parallelität, bei dem Aufgaben in separaten Betriebssystem-Threads ausgeführt werden.



In PHP gab es vor Version 7.4 keine native Thread-Unterstützung. Mit dem Aufkommen der Erweiterungen pthreads und parallel sowie verbesserter Prozessverwaltung hat sich die Situation jedoch geändert.



1. Multithreading mit der parallel-Erweiterung



Die parallel-Erweiterung ist eine moderne Methode für die Arbeit mit Threads in PHP 7.4+. Sie verwendet gemeinsamen Speicher, was einen effizienten Datenaustausch zwischen Threads ermöglicht.



Installation:

pecl install parallel


Beispiel für die Erstellung eines Threads:

<?phpuse parallel\\Runtime;

$runtime = new Runtime();$future = $runtime->run(function() { // Schwere Berechnungen $result = 0; for ($i = 0; $i < 1000000; $i++) { $result += sqrt($i); } return $result;});

echo "Hauptthread arbeitet weiter...";$result = $future->value(); // Ergebnis abrufenecho "Ergebnis: $result";?>


Vorteile von parallel:

  • Native Thread-Unterstützung ohne zusätzliche Abhängigkeiten
  • Gemeinsamer Speicher zwischen Threads
  • Möglichkeit zur Übergabe von Closures und Objekten


Nachteile:

  • Erfordert PHP 7.4+ und ZTS (Zend Thread Safety)
  • Nicht unter Windows unterstützt
  • Schwierigkeiten beim Debugging


2. Asynchronität durch Prozesse: pcntl_fork



Wenn kein gemeinsamer Speicher benötigt wird, können Prozesse mit pcntl_fork() verwendet werden. Dies ist ein klassischer Unix-Ansatz.



<?php$pid = pcntl_fork();

if ($pid == -1) { die("Fehler beim Erstellen des Prozesses");} elseif ($pid) { // Elternprozess echo "Elternprozess: warte auf Kindprozess..."; pcntl_wait($status); echo "Elternprozess: Kindprozess beendet";} else { // Kindprozess echo "Kindprozess: führe Aufgabe aus..."; sleep(3); exit(0);}?>


Besonderheiten bei der Arbeit mit Prozessen:

  • Jeder Prozess hat seinen eigenen Speicher
  • Für den Datenaustausch verwenden Sie Sockets, gemeinsamen Speicher (shmop) oder Dateien
  • Zombie-Prozesse müssen über pcntl_wait() behandelt werden


3. Parallelität durch asynchrone Funktionen und ReactPHP



Für E/A-Aufgaben (Netzwerkanfragen, Dateilesen) sind asynchrone Bibliotheken wie ReactPHP oder Amp effizienter. Sie erstellen keine Threads, ermöglichen aber die gleichzeitige Ausführung von Aufgaben über eine Event Loop.



Beispiel mit ReactPHP:

<?phprequire 'vendor/autoload.php';

use React\\EventLoop\\Factory;use React\\Http\\Browser;

$loop = Factory::create();$client = new Browser($loop);

$promises = [];$urls = [ 'https://api.example.com/data1', 'https://api.example.com/data2', 'https://api.example.com/data3'];

foreach ($urls as $url) { $promises[] = $client->get($url);}

// Warte auf alle Anfragen parallel$results = [];foreach ($promises as $promise) { $results[] = $promise->wait();}

$loop->run();print_r($results);?>

Blogs

Buchempfehlungen