Async PHP વિશેનું સત્ય: Fibers, epoll, અને PHP 8.6
મેં વર્ષો સુધી Laravel સાથે કામ કર્યું છે. હું sync PHP નો ઉપયોગ કરતો હતો. એક રિક્વેસ્ટ આવે છે, પ્રોસેસ ચાલે છે, અને રિસ્પોન્સ જાય છે. મને ક્યારેય async કોડની જરૂર પડી નથી.
પછી મેં નવા PHP 8.6 Polling API વિશે વાંચ્યું. તેણે મારી જોવાની દ્રષ્ટિ બદલી નાખી.
async અંદરથી કેવી રીતે કામ કરે છે તે વિશે મેં જે શીખ્યું છે તે અહીં છે.
IO સમસ્યા
જ્યારે તમે કોઈ API ને કોલ કરો છો, ત્યારે તમારી PHP પ્રોસેસ રાહ જુએ છે.
ઉદાહરણ:
$response = Http::get('https://api.example.com');
જો તે કોલ કરવામાં 300ms લાગે, તો તમારું CPU 300ms સુધી કંઈ જ કરતું નથી. તે સ્લીપ સ્ટેટમાં રહે છે. આને blocking I/O કહેવાય છે.
જો તમારી પાસે ત્રણ API કોલ હોય:
- API A: 300ms
- API B: 400ms
- API C: 200ms
Sequential કુલ: 900ms. Async કુલ: 400ms (સૌથી ધીમા કોલનો સમય).
Async ડેટાની રાહ જોતી વખતે તમારી પ્રોસેસને અન્ય કામ કરવા દે છે.
Select વિરુદ્ધ epoll
async કરવા માટે, તમારે જાણવું જરૂરી છે કે કયા સોકેટમાં ડેટા તૈયાર છે.
select() PHP વર્ઝન 4 થી
stream_select()નો ઉપયોગ કરી રહ્યું છે. તે કર્નલને સોકેટ્સની યાદી પર નજર રાખવા કહે કરીને કામ કરે છે. સમસ્યા: જ્યારે પણ ડેટા આવે છે, ત્યારે તમારે આખી યાદી ફરીથી સ્કેન કરવી પડે છે. આને 'rescan tax' કહેવાય છે. તેની મર્યાદા પણ લગભગ 1024 કનેક્શનની છે.epoll (Linux) / kqueue (macOS) આ કર્નલ ફીચર્સ છે. યાદી સ્કેન કરવાને બદલે, કર્નલ એક ready-list રાખે છે. તે તમને ફક્ત એ જ જણાવે છે કે કયા ચોક્કસ સોકેટ્સ તૈયાર છે. આ વધારાના કામ વગર હજારો કનેક્શન્સ સુધી સ્કેલ કરી શકે છે.
epoll એ PHP ફીચર નથી. તે Linux ફીચર છે. Go, Rust, અને Node.js બધા તેનો ઉપયોગ કરે છે.
Fibers: પોઝ બટન
PHP 8.1 માં Fibers રજૂ કરવામાં આવ્યા હતા. મને લાગ્યું કે Fibers આપમેળે જ જાગી જશે. પણ તે આવું નથી કરતા.
Fiber એ પોઝ કરેલા વીડિયો જેવું છે. જ્યાં સુધી કોઈ $fiber->resume() કોલ ન કરે ત્યાં સુધી તે પોઝમાં રહે છે.
Event Loop એ માત્ર PHP કોડનો એક ભાગ છે જે નક્કી કરે છે કે resume() ક્યારે કોલ કરવું.
Async I/O માટે ત્રણ ભાગોની જરૂર છે:
- Pause: Fibers (PHP 8.1 core)
- Decide: The Event Loop (Plain PHP code)
- Know: Kernel Polling (epoll/kqueue)
PHP 8.6 પહેલા, PHP પાસે "Pause" અને "Decide" ભાગો હતા, પરંતુ "Know" ભાગ જૂના select() અથવા ધીમા C extensions પર આધારિત હતો.
PHP 8.6 આ અંતરને પૂરે છે. તે કોર (core) માં નેટિવ Polling API લાવે છે. હવે, PHP વધારાના એક્સટેન્શન વગર સીધું epoll અથવા kqueue નો ઉપયોગ કરી શકે છે.
મુખ્ય વાત
જો તમે PHP-FPM સાથે Laravel નો ઉપયોગ કરો છો, તો તમારે આજે કંઈપણ બદલવાની જરૂર નથી.
પણ આ સમજો: Async એ કોઈ જાદુ નથી. તે ફક્ત રાહ જોવાનો સમય મેનેજ કરવાની એક સ્માર્ટ રીત છે.
ફક્ત કોડનો ઉપયોગ કરવાનું બંધ કરો. એક સાધારણ સ્ક્રિપ્ટ રન કરો. તેને તોડો (break કરો). આ રીતે જ તમે ખરેખર શીખી શકો છો.
