Einführung in die asynchrone Programmierung in PHP
Traditionell arbeitet PHP im synchronen Modus: Jede Anfrage wird sequenziell, Zeile für Zeile, ausgeführt. In der modernen Webentwicklung wird jedoch zunehmend die gleichzeitige Verarbeitung mehrerer Aufgaben benötigt – vom Versenden von E-Mails bis zur Arbeit mit WebSocket und APIs. Asynchrone Programmierung in PHP ermöglicht es, diese Aufgaben effizient zu lösen, ohne den Hauptausführungsfluss zu blockieren.
In diesem Leitfaden werden wir behandeln, was Asynchronität ist, warum sie benötigt wird und wie man sie in PHP einsetzt. Sie erfahren mehr über die wichtigsten Werkzeuge: Fiber, ReactPHP, Swoole und die integrierten Funktionen für die Arbeit mit Coroutinen.
Was ist asynchrone Programmierung und warum wird sie benötigt?
Synchroner vs. Asynchroner Code
Stellen Sie sich vor, Sie bestellen eine Pizza. Der synchrone Ansatz: Sie rufen an, warten, bis sie zubereitet ist, und legen dann erst auf. Asynchron: Sie rufen an, geben die Bestellung auf, und während die Pizza zubereitet wird, erledigen Sie Ihre eigenen Dinge. In PHP sieht das so aus:
// Synchroner Code (blockierend)$data = file_get_contents('https://api.example.com');echo "Daten empfangen: " . $data; // Warten, bis geladen
// Asynchroner Code (nicht blockierend)$promise = async_file_get_contents('https://api.example.com');echo "Anfrage gesendet, andere Dinge können erledigt werden...";$data = await($promise); // Ergebnis später abrufenProbleme des synchronen PHP
- I/O-Blockierung: Operationen mit Dateien, Datenbanken oder Netzwerkanfragen stoppen die Skriptausführung
- Geringe Leistung: Jede neue Anfrage erfordert einen separaten Prozess oder Thread
- Probleme mit Echtzeit: Chats, Benachrichtigungen und Streaming arbeiten ineffizient
Vorteile des asynchronen Ansatzes
- Gleichzeitige Verarbeitung von Hunderten und Tausenden von Verbindungen
- Einsparung von Speicher und Serverressourcen
- Möglichkeit zur Erstellung von Echtzeitanwendungen
- Reaktionsfähigere Benutzeroberflächen
Die wichtigsten Werkzeuge für asynchrones PHP
1. Coroutinen und Fiber (PHP 8.1+)
Seit PHP 8.1 gibt es integrierte Unterstützung für Fiber – leichtgewichtige Coroutinen. Fiber ermöglicht es, die Ausführung einer Funktion anzuhalten und später fortzusetzen, ohne den Hauptthread zu blockieren.
<?php$fiber = new Fiber(function(): void { $value = Fiber::suspend('first'); echo "Fortgesetzt mit Wert: $value";});
$value = $fiber->start();echo "Startwert: $value"; // first$fiber->resume('second'); // Fortgesetzt mit Wert: second?>2. ReactPHP – Event Loop für PHP
ReactPHP ist eine Bibliothek, die ereignisorientierte Programmierung (event loop) implementiert. Sie ermöglicht nicht blockierende Ein-/Ausgabeoperationen.
<?phprequire 'vendor/autoload.php';
$loop = React\\EventLoop\\Loop::get();
$loop->addTimer(1.0, function () { echo "1 Sekunde vergangen";});
$loop->addTimer(2.0, function () { echo "2 Sekunden vergangen";});
echo "Start...";$loop->run();?>ReactPHP bietet auch asynchrone HTTP-Clients und Server:
<?php$browser = new React\\Http\\Browser($loop);
$browser->get('https://api.example.com')->then( function (Psr\\Http\\Message\\ResponseInterface $response) { echo "Antwort: " . $response->getBody(); }, function (Exception $e) { echo "Fehler: " . $e->getMessage(); });?>3. Swoole – Hochleistungs-Async-Server
Swoole ist eine PHP-Erweiterung, die PHP in einen vollwertigen asynchronen Server verwandelt. Es unterstützt Coroutinen, WebSocket, TCP/UDP-Server und vieles mehr.
<?ph