De Polling API is de meest onderschatte update van PHP
PHP 8.6 bevat een stille update die alles verandert voor netwerken met een hoge mate van gelijktijdigheid.
Terwijl veel ontwikkelaars debatteerden over generics, werd de Polling API met weinig ophef door een RFC gelaten. Het kreeg steun van belangrijke figuren zoals de maker van FrankenPHP en de auteur van Composer.
Jarenlang vertrouwde PHP op stream_select(). Deze tool maakt gebruik van een systeemoproep uit 1983. Het heeft drie grote gebreken:
- Het loopt op de meeste systemen tegen een limiet van 1024 file descriptors aan.
- Het maakt gebruik van O(n)-complexiteit, wat betekent dat de prestaties afnemen naarmate je meer verbindingen toevoegt.
- Het heeft geen toegang tot moderne tools zoals epoll op Linux of kqueue op macOS.
Dit is waarom async-libraries zoals AMPHP of ReactPHP extra extensies zoals ext-uv nodig hadden om goed te presteren. PHP miste de natuurlijke basis voor netwerken op grote schaal.
De Polling API lost dit gat op.
Het introduceert de Io\Poll namespace. Deze API kiest automatisch de beste backend voor je systeem. Het gebruikt epoll op Linux, kqueue op macOS en event ports op Solaris. Je hoeft deze details niet zelf te beheren.
Zo werkt het in de praktijk:
Je maakt een Context aan.
Je verpakt een stream in een StreamPollHandle.
Je voegt deze toe aan de context met de events die je wilt monitoren.
Je roept wait() aan om alleen de triggers te ontvangen die daadwerkelijk hebben plaatsgevonden.
Dit is geen volledige event loop. Het is een low-level primitief. Het biedt de onderliggende infrastructuur die ervoor zorgt dat event loops sneller en betrouwbaarder kunnen draaien.
De echte magie zit intern. Deze API stelt de PHP-core en extensies in staat om een verenigde interface te delen. Het maakt het volgende mogelijk:
- Efficiënte signal handling voor FrankenPHP.
- Betere event handling in PHP-FPM workers.
- Gestandaardiseerde interfaces voor sockets en curl.
- High-performance edge-triggered modi.
Mensen zeggen vaak dat PHP niet kan schalen. Lange tijd was daar een technische reden voor. PHP had geen natuurlijke toegang tot de polling-primitieven die door Nginx of Go worden gebruikt.
Met PHP 8.6 is dat excuus verdwenen.
De beste infrastructurele veranderingen zijn vaak onzichtbaar. Je merkt epoll niet op. Je merkt alleen dat een server tienduizend verbindingen afhandelt zonder moeite.
De Polling API is het onopvallende werk dat het plafond voor het hele ecosysteem verhoogt.
Bron: https://dev.to/juststevemcd/the-polling-api-is-the-most-underrated-rfc-php-has-shipped-in-years-2d32
