The Truth About Async PHP: Fibers, epoll, and PHP 8.6
Ik heb jarenlang met Laravel gewerkt. Ik gebruikte synchrone PHP. Er komt een verzoek binnen, het proces draait, en het antwoord wordt verzonden. Ik had nooit async code nodig.
Toen las ik over de nieuwe PHP 8.6 Polling API. Het veranderde mijn hele kijk op zaken.
Dit is wat ik heb geleerd over hoe async onder de motorkap werkt.
The IO Problem
Wanneer je een API aanroept, wacht je PHP-proces.
Voorbeeld:
$response = Http::get('https://api.example.com');
Als die aanroep 300ms duurt, doet je CPU gedurende 300ms niets. Het blijft in een slaapstand. Dit is blocking I/O.
Als je drie API-aanroepen hebt:
- API A: 300ms
- API B: 400ms
- API C: 200ms
Totaal sequentieel: 900ms. Totaal async: 400ms (de tijd van de langzaamste aanroep).
Async stelt je proces in staat om ander werk te doen terwijl het op data wacht.
Select vs. epoll
Om async te gebruiken, moet je weten welke socket klaar is met data.
select() PHP gebruikt
stream_select()al sinds versie 4. Het werkt door de kernel te vragen een lijst met sockets in de gaten te houden. Het probleem: Elke keer dat er data binnenkomt, moet je de hele lijst opnieuw scannen. Dit is een rescan-belasting. Het heeft ook een limiet van ongeveer 1024 verbindingen.epoll (Linux) / kqueue (macOS) Dit zijn kernel-functies. In plaats van een lijst te scannen, houdt de kernel een ready-list bij. Het vertelt je alleen welke specifieke sockets klaar zijn. Dit schaalt naar duizenden verbindingen zonder extra werk.
epoll is geen PHP-feature. Het is een Linux-feature. Go, Rust en Node.js gebruiken het allemaal.
Fibers: The Pause Button
PHP 8.1 introduceerde Fibers. Ik dacht dat Fibers vanzelf zouden ontwaken. Dat doen ze niet.
Een Fiber is als een gepauzeerde video. Hij blijft gepauzeerd totdat iemand $fiber->resume() aanroept.
Een Event Loop is simpelweg een stukje PHP-code dat beslist wanneer resume() moet worden aangeroepen.
Async I/O vereist drie onderdelen:
- Pauzeren: Fibers (PHP 8.1 core)
- Beslissen: De Event Loop (gewone PHP-code)
- Weten: Kernel Polling (epoll/kqueue)
Voor PHP 8.6 had PHP de onderdelen "Pauzeren" en "Beslissen", maar vertrouwde het onderdeel "Weten" op de oude select() of trage C-extensies.
PHP 8.6 overbrugt dit gat. Het brengt een native Polling API naar de core. Nu kan PHP epoll of kqueue direct gebruiken zonder extra extensies.
The Takeaway
Als je Laravel gebruikt met PHP-FPM, hoef je vandaag niets te veranderen.
Maar begrijp dit: Async is geen magie. Het is gewoon een slimme manier om wachttijd te beheren.
Stop met alleen maar code consumeren. Draai een simpel script. Breek het. Dat is hoe je echt leert.
