The Truth About Async PHP: Fibers, epoll, and PHP 8.6

Ich habe jahrelang mit Laravel gearbeitet. Ich habe synchrones PHP genutzt. Eine Anfrage kommt rein, der Prozess läuft ab und die Antwort geht raus. Ich habe nie asynchronen Code benötigt.

Dann habe ich über die neue PHP 8.6 Polling API gelesen. Das hat meine gesamte Sichtweise verändert.

Hier ist das, was ich darüber gelernt habe, wie Async unter der Haube funktioniert.

The IO Problem

Wenn man eine API aufruft, wartet der PHP-Prozess. Beispiel: $response = Http::get('https://api.example.com');

Wenn dieser Aufruf 300 ms dauert, tut die CPU für 300 ms nichts. Sie verbleibt in einem Schlafzustand. Das ist blockierendes I/O.

Wenn man drei API-Aufrufe hat:

  • API A: 300 ms
  • API B: 400 ms
  • API C: 200 ms

Sequenziell gesamt: 900 ms. Async gesamt: 400 ms (die Zeit des langsamsten Aufrufs).

Async ermöglicht es dem Prozess, andere Arbeiten zu erledigen, während er auf Daten wartet.

Select vs. epoll

Um Async zu nutzen, muss man wissen, welcher Socket bereitstehende Daten hat.

  1. select() PHP verwendet stream_select() bereits seit Version 4. Es funktioniert, indem der Kernel gebeten wird, eine Liste von Sockets zu überwachen. Das Problem: Jedes Mal, wenn Daten eintreffen, muss die gesamte Liste erneut gescannt werden. Das ist eine Art „Rescan-Steuer“. Zudem gibt es ein Limit von etwa 1024 Verbindungen.

  2. epoll (Linux) / kqueue (macOS) Dies sind Kernel-Features. Anstatt eine Liste zu scannen, führt der Kernel eine „Ready-List“. Er teilt einem nur mit, welche spezifischen Sockets bereit sind. Dies skaliert auf Tausende von Verbindungen ohne zusätzlichen Aufwand.

epoll ist kein PHP-Feature. Es ist ein Linux-Feature. Go, Rust und Node.js nutzen es alle.

Fibers: The Pause Button

PHP 8.1 hat Fibers eingeführt. Ich dachte, Fibers würden von selbst wieder aufwachen. Tun sie aber nicht.

Ein Fiber ist wie ein angehaltenes Video. Es bleibt pausiert, bis jemand $fiber->resume() aufruft.

Ein Event Loop ist lediglich ein Stück PHP-Code, das entscheidet, wann resume() aufgerufen wird.

Async I/O erfordert drei Teile:

  • Pause: Fibers (PHP 8.1 Core)
  • Entscheiden: Der Event Loop (reiner PHP-Code)
  • Wissen: Kernel Polling (epoll/kqueue)

Vor PHP 8.6 verfügte PHP über die Teile „Pause“ und „Entscheiden“, aber der Teil „Wissen“ verließ sich auf das alte select() oder langsame C-Extensions.

PHP 8.6 schließt diese Lücke. Es bringt eine native Polling API direkt in den Core. Jetzt kann PHP epoll oder kqueue direkt nutzen, ohne zusätzliche Extensions zu benötigen.

The Takeaway

Wenn Sie Laravel mit PHP-FPM verwenden, müssen Sie heute nichts ändern.

Aber verstehen Sie eines: Async ist keine Magie. Es ist nur eine intelligente Art, Wartezeiten zu verwalten.

Hören Sie auf, Code nur zu konsumieren. Lassen Sie ein einfaches Skript laufen. Bringen Sie es zum Absturz. So lernt man wirklich.

Source: https://dev.to/alamriku/sync-php-developer-hisebe-async-php-bujhte-giye-yaa-shikhlaam-fibers-epoll-aar-php-86-462j