Parallelität und Multithreading in PHP: Von A bis Z

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

Einführung in Parallelität und Multithreading in PHP

PHP gilt traditionell als synchrone und single-threaded Sprache. Moderne Webanwendungen erfordern jedoch die gleichzeitige Verarbeitung vieler Aufgaben: Datei-Uploads, API-Interaktionen, Queue-Verarbeitung. Parallelität und Multithreading in PHP ermöglichen es, diese Aufgaben zu lösen, indem sie die Ausführung von Skripten beschleunigen und die Reaktionsfähigkeit von Anwendungen verbessern.

In diesem Artikel behandeln wir die wichtigsten Konzepte: von den grundlegenden Prinzipien der Parallelität bis zur praktischen Anwendung der Erweiterungen pthreads und parallel. Sie erfahren, wie Sie die parallele Ausführung von Aufgaben organisieren, Datenrennen vermeiden und die Leistung Ihres PHP-Codes steigern.



Grundlegende Konzepte von Parallelität und Multithreading

Synchron vs. Asynchron

Im synchronen Modell führt PHP Code streng sequentiell aus. Wenn ein Skript eine HTTP-Anfrage stellt, wird die Ausführung bis zum Erhalt der Antwort angehalten. Asynchronität ermöglicht es, Aufgaben zu starten, ohne auf deren Abschluss zu warten.

Beispiel für synchronen Code:

<?php$result1 = file_get_contents('https://api.example.com/data1');$result2 = file_get_contents('https://api.example.com/data2');// Beide Anfragen werden sequentiell ausgeführt?>


Threads und Prozesse

  • Prozess — eine isolierte Kopie eines Programms mit eigenem Adressraum.
  • Thread — eine leichtgewichtige Ausführungseinheit innerhalb eines Prozesses, die sich den Speicher teilt.

In PHP wird Multithreading über Threads realisiert. Für die Arbeit damit sind spezielle Erweiterungen erforderlich, da die Standard-PHP-Installation keine Threads unterstützt.



Datenrennen und Synchronisation

Bei der Arbeit mehrerer Threads mit gemeinsamen Daten kann ein Race Condition auftreten. Zur Vermeidung werden Mutexe, Sperren und atomare Operationen verwendet.



Werkzeuge für Multithreading in PHP

Die pthreads-Erweiterung

pthreads — eine der ersten Erweiterungen für die Arbeit mit Threads. Sie bietet die Klassen Thread, Worker und Pool. Wichtig: Die Erweiterung funktioniert nur im CLI-Modus und erfordert eine ZTS (Zend Thread Safety) PHP-Build.

Beispiel für einen einfachen Thread:

<?phpclass MyThread extends Thread {    public function run() {        echo "Thread gestartet";    }}$thread = new MyThread();$thread->start();$thread->join();?>


Die parallel-Erweiterung

parallel — eine modernere Erweiterung, die in PHP 7.4 eingeführt wurde. Sie ist bequemer und sicherer. Sie arbeitet über Kanäle (channels) zur Datenübertragung zwischen Threads.

Beispiel mit parallel:

<?php$runtime = new \\parallel\\Runtime();$future = $runtime->run(function(){    return "Hallo aus dem parallelen Thread!";});echo $future->value(); // Ergebnis abrufen?>


Asynchronität mit ReactPHP und Amp

Wenn Sie kein echtes Multithreading benötigen, aber Parallelität wünschen, verwenden Sie Bibliotheken für asynchrone Ein-/Ausgabe:

  • ReactPHP — eine ereignisorientierte Bibliothek mit Event Loop.
  • Amp — async/await für PHP, ähnlich wie in JavaScript.


Praktische Beispiele und Best Practices

Beispiel: Parallele Verarbeitung von URLs

Angenommen, Sie müssen die Erreichbarkeit von 10 Websites überprüfen. Synchron würde dies viel Zeit in Anspruch nehmen. Verwenden Sie parallel zur Beschleunigung:

<?php$urls = [    'https://google.com',    'https://yandex.ru',    'https://github.com'];

$runtimes = [];$futures = [];

foreach ($urls as $url) { $runtime = new \\parallel\\Runtime(); $runtimes[] = $runtime; $futures[] = $runtime->run(function($url) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 5);

Blogs

Buchempfehlungen