Das habe ich als Sync-PHP-Entwickler über Async-PHP gelernt
Ich habe jahrelang mit Laravel gearbeitet. Ich habe synchrones PHP genutzt. Eine Anfrage kommt rein, ein Prozess läuft ab und eine Antwort geht raus. Ich habe Async nie benötigt.
Dann habe ich über die neue PHP 8.6 Polling-API gelesen. Sie hat meine Sichtweise darauf verändert, wie PHP Aufgaben verarbeitet.
Hier ist die Aufschlüsselung, wie Async funktioniert.
Das Problem mit blockierendem I/O
Wenn Sie eine API aufrufen, wartet Ihr Code.
Beispiel: $response = Http::get('https://api.example.com');
Wenn diese API 300 ms benötigt, tut Ihr PHP-Prozess für 300 ms nichts. Er befindet sich in einem Schlafzustand. Er belegt Speicher und besetzt einen Worker-Slot. Wenn alle Ihre Worker schlafen, hört Ihr Server auf, neue Anfragen anzunehmen.
Die Async-Lösung
Async ermöglicht es Ihnen, während dieser 300 ms andere Arbeiten zu erledigen. Anstatt zu warten, führen Sie andere Aufgaben aus.
Aber woher wissen Sie, wann die Daten ankommen? Hier kommt der Kernel ins Spiel.
Die Evolution des Pollings
select() PHP verfügt seit PHP 4 über
stream_select(). Es fragt den Kernel: „Sind auf diesen Sockets Daten bereit?“ Das Problem ist die „Rescan-Steuer“. Wenn Sie 10.000 Verbindungen haben, müssen Sie jedes Mal die gesamte Liste an den Kernel senden. Das ist langsam und stößt an Grenzen.epoll / kqueue Dies ist ein Kernel-Feature, kein Sprach-Feature. Linux verwendet epoll. macOS verwendet kqueue. Anstatt eine vollständige Liste zu scannen, führt der Kernel eine Ready-List. Er teilt Ihnen nur mit, welche spezifischen Sockets Daten haben. Dies skaliert auf Tausende von Verbindungen ohne zusätzlichen Aufwand.
Fibers (PHP 8.1) Fibers ermöglichen es Ihnen, eine Funktion an jeder beliebigen Stelle im Call Stack zu pausieren. Ein Fiber wacht nicht von selbst auf. Es ist wie ein angehaltenes YouTube-Video. Jemand muss
$fiber->resume()aufrufen, um es wieder abzuspielen.
Das fehlende Bindeglied: PHP 8.6
Async I/O erfordert drei Teile: • Pause: Fibers (jetzt im PHP-Core) • Entscheiden: Der Event Loop (reiner PHP-Code) • Wissen: Kernel Polling (die Lücke)
Bisher fehlte PHP eine native Möglichkeit zu „wissen“, welcher Socket bereit ist, ohne alte Werkzeuge oder C-Extensions zu verwenden.
PHP 8.6 schließt diese Lücke. Es bringt eine native Polling-API in den Core. Es wird automatisch epoll unter Linux und kqueue auf dem Mac verwenden.
Das große Ganze
Async ist keine Magie. Ein Event Loop ist einfach nur PHP-Code, der entscheidet, wann resume() auf einem Fiber aufgerufen wird.
Fibers bieten die Möglichkeit zu pausieren. epoll bietet die Intelligenz zu wissen, wann man das Pausieren aufhebt.
Wenn Sie nur synchrones PHP verwenden, müssen Sie Ihre Laravel-Apps heute nicht ändern. Aber das Verständnis dieses Modells macht es viel einfacher, Async-Bibliotheken wie ReactPHP oder Amp zu beherrschen.
Bauen Sie selbst, anstatt nur zu konsumieren. Führen Sie den Code selbst aus, um zu sehen, wie er funktioniert.
