એક Sync PHP ડેવલપર તરીકે મેં Async PHP વિશે શું શીખ્યું
મેં વર્ષો સુધી Laravel સાથે કામ કર્યું છે. હું sync PHP નો ઉપયોગ કરતો હતો. એક રિક્વેસ્ટ આવે છે, એક પ્રોસેસ ચાલે છે, અને એક રિસ્પોન્સ જાય છે. મને ક્યારેય async ની જરૂર પડી નથી.
પછી મેં નવા PHP 8.6 Polling API વિશે વાંચ્યું. તેણે PHP કેવી રીતે કાર્યો (tasks) હેન્ડલ કરે છે તે અંગેનો મારો દૃષ્ટિકોણ બદલી નાખ્યો.
Async કેવી રીતે કામ કરે છે તેનું વિગતવાર વિશ્લેષણ અહીં છે.
Blocking I/O સાથેની સમસ્યા
જ્યારે તમે કોઈ API ને કોલ કરો છો, ત્યારે તમારો કોડ રાહ જુએ છે.
ઉદાહરણ: $response = Http::get('https://api.example.com');
જો તે API 300ms લે છે, તો તમારી PHP પ્રોસેસ 300ms સુધી કંઈ જ કરતી નથી. તે 'sleep state' માં રહે છે. તે મેમરી રોકે છે અને વર્કર સ્લોટ (worker slot) રોકી રાખે છે. જો તમારા બધા વર્કર્સ ઊંઘતા (sleeping) હશે, તો તમારું સર્વર નવી રિક્વેસ્ટ સ્વીકારવાનું બંધ કરી દેશે.
Async સોલ્યુશન
Async તમને તે 300ms દરમિયાન અન્ય કામ કરવા દે છે. રાહ જોવાને બદલે, તમે અન્ય કાર્યો કરી શકો છો.
પરંતુ ડેટા ક્યારે આવશે તે તમને કેવી રીતે ખબર પડશે? અહીં કર્નલ (kernel) ની ભૂમિકા આવે છે.
Polling નો વિકાસ
select() PHP 4 થી PHP માં stream_select() ઉપલબ્ધ છે. તે કર્નલને પૂછે છે: "શું આ સોકેટ્સ (sockets) પર કોઈ ડેટા તૈયાર છે?" સમસ્યા 'rescan tax' ની છે. જો તમારી પાસે 10,000 કનેક્શન હોય, તો તમારે દર વખતે આખી યાદી કર્નલને મોકલવી પડે છે. આ ધીમું છે અને તેની મર્યાદાઓ છે.
epoll / kqueue આ કર્નલ ફીચર છે, લેંગ્વેજ ફીચર નથી. Linux epoll નો ઉપયોગ કરે છે. macOS kqueue નો ઉપયોગ કરે છે. આખી યાદી સ્કેન કરવાને બદલે, કર્નલ એક 'ready-list' જાળવી રાખે છે. તે તમને ફક્ત એ જ જણાવે છે કે કયા ચોક્કસ સોકેટ્સ પર ડેટા છે. આ વધારાના ખર્ચ વગર હજારો કનેક્શન્સ સુધી સ્કેલ કરી શકે છે.
Fibers (PHP 8.1) Fibers તમને કોલ સ્ટેક (call stack) માં ગમે ત્યાં ફંક્શનને પોઝ (pause) કરવાની મંજૂરી આપે છે. Fiber પોતાની મેળે જ જાગતું નથી. તે પોઝ કરેલા YouTube વિડિયો જેવું છે. તેને ફરીથી ચલાવવા માટે કોઈએ
$fiber->resume()કોલ કરવું પડે છે.
ખૂટતી કડી: PHP 8.6
Async I/O માટે ત્રણ ભાગોની જરૂર છે: • Pause: Fibers (હવે PHP core માં) • Decide: The Event Loop (સામાન્ય PHP કોડ) • Know: Kernel Polling (ખૂટતો ભાગ)
અત્યાર સુધી, જૂના સાધનો અથવા C extensions નો ઉપયોગ કર્યા વિના કયો સોકેટ તૈયાર છે તે "જાણવા" માટે PHP પાસે કોઈ નેટિવ (native) રીત નહોતી.
PHP 8.6 આ અંતરને પૂરું કરે છે. તે કોર (core) માં નેટિવ Polling API લાવે છે. તે Linux પર આપમેળે epoll અને Mac પર kqueue નો ઉપયોગ કરશે.
સમગ્ર દૃષ્ટિકોણ
Async કોઈ જાદુ નથી. Event loop એ માત્ર PHP કોડ છે જે નક્કી કરે છે કે Fiber પર ક્યારે resume() કોલ કરવું.
Fibers પોઝ કરવાની ક્ષમતા આપે છે. epoll ક્યારે અનપોઝ (unpause) કરવું તે જાણવાની બુદ્ધિ આપે છે.
જો તમે ફક્ત sync PHP નો ઉપયોગ કરો છો, તો તમારે આજે તમારા Laravel એપ્સ બદલવાની જરૂર નથી. પરંતુ આ મોડેલ સમજવાથી ReactPHP અથવા Amp જેવી async લાઇબ્રેરીઓમાં માસ્ટરી મેળવવી ઘણી સરળ બની જાય છે.
માત્ર ઉપયોગ કરનાર ન બનો, નિર્માતા બનો. તે કેવી રીતે કામ કરે છે તે જોવા માટે જાતે કોડ રન કરો.
