Hivi Ndivyo Nilivyojifunza Kama Msanidi wa PHP wa Sync Kuhusu Async PHP

Nilifanya kazi na Laravel kwa miaka mingi. Nilitumia PHP ya sync. Ombi linakuja, mchakato unaendeshwa, na jibu linatolewa. Sikuwahi kuhitaji async.

Kisha nikasoma kuhusu Polling API mpya ya PHP 8.6. Ilibadilisha mtazamo wangu kuhusu jinsi PHP inavyoshughulikia kazi.

Huu hapa ni mchanganuo wa jinsi async inavyofanya kazi.

Tatizo la Blocking I/O

Unapoita API, kodi yako inasubiri. Mfano: $response = Http::get('https://api.example.com');

Ikiwa API hiyo inachukua 300ms, mchakato wako wa PHP haufanyi kitu kwa muda wa 300ms. Unakaa katika hali ya kulala (sleep state). Unashikilia kumbukumbu (memory) na kuchukua nafasi ya mfanyakazi (worker slot). Ikiwa wafanyakazi wako wote wamelala, seva yako itaacha kupokea maombi mapya.

Suluhisho la Async

Async inakuwezesha kufanya kazi nyingine wakati wa hizo 300ms. Badala ya kusubiri, unaendesha kazi nyingine.

Lakini unajuaje wakati data inapowasili? Hapa ndipo kernel inapoingia.

Mageuzi ya Polling

  1. select() PHP imekuwa na stream_select() tangu PHP 4. Inauliza kernel: "Je, kuna data yoyote iliyo tayari kwenye sockets hizi?" Tatizo ni gharama ya kukagua upya (rescan tax). Ikiwa una miunganisho (connections) 10,000, lazima utume orodha nzima kwa kernel kila wakati. Hii ni polepole na inafikia mipaka.

  2. epoll / kqueue Hii ni kipengele cha kernel, si kipengele cha lugha. Linux inatumia epoll. macOS inatumia kqueue. Badala ya kukagua orodha nzima, kernel inadumisha orodha ya tayari (ready-list). Inakuambia tu ni sockets gani mahususi zenye data. Hii inaweza kukabiliana na maelfu ya miunganisho bila gharama ya ziada.

  3. Fibers (PHP 8.1) Fibers zinakuwezesha kusimamisha (pause) function mahali popote katika call stack. Fiber haiamki yenyewe. Ni kama video ya YouTube iliyosimamasishwa. Lazima mtu aitie $fiber->resume() ili kuicheza tena.

Kiungo Kilichokosekana: PHP 8.6

Async I/O inahitaji sehemu tatu: • Kusimamisha (Pause): Fibers (Sasa katika PHP core) • Kuamua (Decide): The Event Loop (Kodi ya kawaida ya PHP) • Kujua (Know): Kernel Polling (Pengo)

Hadi sasa, PHP ilikuwa haina njia ya asili ya "kujua" ni socket gani iliyo tayari bila kutumia zana za zamani au C extensions.

PHP 8.6 inafunga pengo hili. Inaleta Polling API ya asili kwenye core. Itatumia kiotomatiki epoll kwenye Linux na kqueue kwenye Mac.

Picha Kamili

Async si uchawi. Event loop ni kodi ya PHP tu inayofanya uamuzi wa lini kuitia resume() kwenye Fiber.

Fibers zinatoa uwezo wa kusimamisha. epoll inatoa akili ya kujua wakati wa kuendelea.

Ikiwa unatumia PHP ya sync pekee, huhitaji kubadilisha programu zako za Laravel leo. Lakini kuelewa mfumo huu kunaifanya iwe rahisi zaidi kumudu maktaba za async kama ReactPHP au Amp.

Jenga, usitumie tu. Endesha kodi mwenyewe ili uone jinsi inavyofanya kazi.

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