Asynchrone Programmierung in PHP: Vollständiger Leitfaden

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 die asynchrone Programmierung in PHP

Traditionell gilt PHP als synchrone Sprache: Jede Anfrage wird sequenziell ausgeführt und blockiert die Ausführung, bis eine E/A-Operation (z. B. Lesen einer Datei oder Datenbankabfrage) abgeschlossen ist. Mit der zunehmenden Beliebtheit von hochlastigen Webanwendungen und Microservices ist jedoch die Notwendigkeit entstanden, Zehntausende gleichzeitiger Verbindungen zu verarbeiten, ohne die Anzahl der Prozesse zu skalieren. Asynchrone Programmierung löst dieses Problem, indem sie die gleichzeitige Ausführung von Operationen innerhalb eines einzelnen Threads ermöglicht.

In diesem Leitfaden werden wir untersuchen, wie Asynchronität in PHP funktioniert, welche Tools verfügbar sind und wie man nicht-blockierende Anwendungen richtig erstellt. Sie erfahren etwas über Generatoren, Coroutinen, die Bibliotheken ReactPHP, Amp und Swoole sowie die neue Erweiterung Fibers.



Grundlagen der Asynchronität: Event Loop und nicht-blockierende E/A

Asynchrone Programmierung basiert auf dem Konzept der Event Loop (Ereignisschleife). Dies ist eine Endlosschleife, die auf Ereignisse wartet und diese verarbeitet: Netzwerkanfragen, Abschluss von E/A-Operationen, Timer. Anstatt auf den Abschluss einer Operation zu warten, registriert der Code einen Callback, der ausgeführt wird, wenn die Daten bereit sind. Dadurch wird keine CPU-Zeit mit Warten verschwendet.

PHP verwendet traditionell blockierende Funktionen (z. B. file_get_contents() oder sleep()). Für asynchrone Arbeit müssen diese durch nicht-blockierende Gegenstücke ersetzt werden. Hier ist ein einfaches Beispiel mit der Bibliothek ReactPHP:

<?phprequire 'vendor/autoload.php';

use React\\EventLoop\\Factory;use React\\Promise\\Promise;

$loop = Factory::create();

// Asynchrones Lesen einer Datei$promise = new Promise(function ($resolve, $reject) use ($loop) { $loop->addTimer(0.001, function () use ($resolve) { $content = file_get_contents('/etc/hosts'); $resolve($content); });});

$promise->then(function ($data) { echo "Gelesen: " . strlen($data) . " Bytes";});

echo "Dieser Code wird sofort ausgeführt, ohne auf das Lesen der Datei zu warten";$loop->run();?>

In diesem Beispiel registriert addTimer eine Aufgabe, die im nächsten Tick der Schleife ausgeführt wird. Die Event Loop wird nicht blockiert, und wir sehen die Nachricht sofort, während das Ergebnis des Lesevorgangs später erscheint.



Generatoren und Coroutinen: Steuerung des Ausführungsflusses

Generatoren (yield) wurden in PHP 5.5 eingeführt und ermöglichen es, die Ausführung einer Funktion zu unterbrechen und Zwischenwerte zurückzugeben. Auf ihrer Basis werden Coroutinen aufgebaut – leichtgewichtige Threads, die die Kontrolle freiwillig abgeben können. In Kombination mit der Event Loop ermöglichen Generatoren das Schreiben von Code, der wie synchron aussieht, aber asynchron ausgeführt wird.

Betrachten wir ein Beispiel mit der Bibliothek Amp, die Coroutinen verwendet:

<?phprequire 'vendor/autoload.php';

use Amp\\Loop;use Amp\\Delayed;

// Asynchrone Coroutine$coroutine = function () { echo "Start der Coroutine"; // Unterbrechung für 1 Sekunde ohne Blockierung yield new Delayed(1000); echo "1 Sekunde vergangen"; yield new Delayed(500); echo "Weitere 0.5 Sekunden vergangen";};

Loop::run(function () use ($coroutine) { // Coroutine starten $result = yield from $coroutine(); echo "Coroutine abgeschlossen";});?>

In diesem Code unterbricht yield new Delayed(1000) die Ausführung der Coroutine und übergibt die Kontrolle zurück an die Event Loop. Nach 1 Sekunde wird die Ausführung an derselben Stelle fortgesetzt. Dies ermöglicht die gleichzeitige Verarbeitung Tausender solcher Coroutinen, ohne neue Prozesse zu erstellen.



Bibliotheken und Tools für asynchrones PHP

Für die Arbeit mit Asynchronität in PHP gibt es mehrere ausgereifte Bibliotheken. Betrachten wir die drei bekanntesten.

ReactPHP

ReactPHP ist die älteste und bekannteste Bibliothek. Sie bietet eine Event Loop, Promise (analog zu JavaS

Blogs

Buchempfehlungen