Einführung in die asynchrone Programmierung in PHP
Traditionell gilt PHP als synchrone Sprache: Jede Anfrage wird sequenziell ausgeführt und blockiert die Ausführung, bis ein Vorgang abgeschlossen ist (z. B. eine Datenbankabfrage oder ein API-Aufruf). Mit steigenden Leistungsanforderungen an Webanwendungen wird die asynchrone Programmierung in PHP jedoch immer gefragter. Asynchroner Code ermöglicht die gleichzeitige Ausführung mehrerer Aufgaben, ohne auf den Abschluss jeder einzelnen warten zu müssen, was die Verarbeitung von Anfragen erheblich beschleunigt und die Serverlast reduziert.
In diesem Leitfaden werden wir die grundlegenden Konzepte der asynchronen Programmierung in PHP erläutern, beliebte Bibliotheken (ReactPHP, Amp) sowie moderne Sprachfunktionen wie Fiber und Generatoren betrachten.
Grundlagen der Asynchronität: Event Loop und nicht-blockierende Ein-/Ausgabe
Die Grundlage jedes asynchronen Ansatzes ist der Event Loop (Ereignisschleife). Es handelt sich um eine Endlosschleife, die prüft, ob ein Ereignis eingetreten ist (z. B. eine HTTP-Anfrage abgeschlossen oder eine Datei gelesen wurde). Wenn ein Ereignis eintritt, wird der entsprechende Handler ausgeführt. Dabei wird der Hauptthread nicht blockiert – er kann zu einer anderen Aufgabe wechseln.
Nicht-blockierende Ein-/Ausgabe (Non-blocking I/O) ist ein Schlüsselprinzip. In synchronem Code blockiert der Aufruf von file_get_contents() die Skriptausführung, bis die Datei vollständig geladen ist. Im asynchronen Modus initiieren Sie einen Vorgang und führen anderen Code weiter aus, während das Ergebnis über einen Callback oder Promise eintrifft.
Beispiel: synchrone vs. asynchrone Anfrage
// Synchroner Code (blockierend)$start = microtime(true);$data1 = file_get_contents('http://example.com/api1');$data2 = file_get_contents('http://example.com/api2');echo "Ausführungszeit: " . (microtime(true) - $start) . " Sek"; // ~2 Sek (wenn jede Anfrage 1 Sek dauert)
// Asynchroner Code (ReactPHP)$loop = React\\EventLoop\\Factory::create();$client = new React\\Http\\Browser($loop);
$promise1 = $client->get('http://example.com/api1');$promise2 = $client->get('http://example.com/api2');
$promise1->then(function ($response) { echo "Antwort 1 erhalten";});$promise2->then(function ($response) { echo "Antwort 2 erhalten";});
$loop->run();// Ausführungszeit ~1 Sek (Anfragen werden parallel ausgeführt)Bibliotheken für asynchrone Programmierung in PHP
Heutzutage sind die beiden beliebtesten Bibliotheken ReactPHP und Amp. Beide bieten einen Event Loop, Promises sowie fertige Komponenten für die Arbeit mit HTTP, Sockets und dem Dateisystem.
ReactPHP
ReactPHP ist eine ausgereifte Bibliothek, die seit 2012 existiert. Sie bietet einen Low-Level-Zugriff auf die Ereignisschleife und zahlreiche Komponenten: react/socket, react/http, react/dns und andere.
// Beispiel eines HTTP-Servers mit ReactPHP$loop = React\\EventLoop\\Factory::create();$server = new React\\Http\\Server($loop, function (Psr\\Http\\Message\\ServerRequestInterface $request) { return new React\\Http\\Message\\Response( 200, ['Content-Type' => 'text/plain'], "Hello, Async World!" );});$socket = new React\\Socket\\Server('127.0.0.1:8080', $loop);$server->listen($socket);echo "Server gestartet unter http://127.0.0.1:8080";$loop->run();Amp
Amp verwendet Coroutinen (generator-basierte Coroutinen) und bietet eine höherwertige API. Anstelle von then()-Ketten verwenden Sie yield und await, wodurch der Code synchronem Code ähnelt.
// Beispiel mit Amp\\Amp\\Loop::run(function () { $response = yield \\Amp\\Http\\Client\\HttpClient::request('http://example.com'); $body = yield $response->getBody()->buffer(); echo $body;});Fiber: Asynchronität im PHP 8.1-Kern
Seit PHP 8.1 wurden dem Sprachkern
Blogs
Buchempfehlungen
Lesen Sie auch
GraphQL API mit Swift: Schritt-für-Schritt-Tutorial für iOS und macOS
Wie man C++-Entwickler wird: Tipps und Lebenslauf in der Praxis
Kotlin im Jahr 2025: Die wichtigsten Neuerungen und Updates der Sprache
Funktionale Programmierung in C++: Moderne Möglichkeiten und Beispiele
Code-Review in Swift: Was zu prüfen ist und wie man Feedback gibt