Async PHP बद्दलचे सत्य: Fibers, epoll आणि PHP 8.6
मी अनेक वर्षे Laravel सोबत काम केले आहे. मी sync PHP वापरत होतो. एक रिक्वेस्ट येते, प्रोसेस चालते आणि रिस्पॉन्स जातो. मला कधीही async कोडची गरज भासली नाही.
मग मी नवीन PHP 8.6 Polling API बद्दल वाचले. त्यामुळे माझी सर्व गोष्टींकडे पाहण्याची दृष्टी बदलली.
async अंतर्गत (under the hood) कसे काम करते, याबद्दल मी जे शिकलो ते खालीलप्रमाणे आहे.
IO ची समस्या
जेव्हा तुम्ही एखादे API कॉल करता, तेव्हा तुमची PHP प्रोसेस थांबते (wait करते).
उदाहरण:
$response = Http::get('https://api.example.com');
जर त्या कॉलला 300ms लागले, तर तुमचे CPU 300ms पर्यंत काहीच करत नाही. ते 'sleep state' मध्ये राहते. याला 'blocking I/O' म्हणतात.
जर तुमच्याकडे तीन API कॉल्स असतील:
- API A: 300ms
- API B: 400ms
- API C: 200ms
Sequential एकूण वेळ: 900ms. Async एकूण वेळ: 400ms (सर्वात संथ कॉल लागणारा वेळ).
Async मुळे डेटाची प्रतीक्षा करत असताना तुमची प्रोसेस इतर कामे करू शकते.
Select विरुद्ध epoll
Async करण्यासाठी, कोणत्या socket मध्ये डेटा तयार आहे हे तुम्हाला माहित असणे आवश्यक आहे.
select() PHP आवृत्ती 4 पासून stream_select() वापरत आहे. हे kernel ला sockets च्या सूचीवर (list) लक्ष ठेवण्यास सांगून काम करते. समस्या: प्रत्येक वेळी डेटा आल्यावर, तुम्हाला संपूर्ण सूची पुन्हा स्कॅन करावी लागते. याला 'rescan tax' म्हणतात. तसेच याची मर्यादा सुमारे 1024 कनेक्शन्स इतकी आहे.
epoll (Linux) / kqueue (macOS) हे kernel चे फीचर्स आहेत. सूची स्कॅन करण्याऐवजी, kernel एक 'ready-list' ठेवते. ते तुम्हाला फक्त कोणते विशिष्ट sockets तयार आहेत हे सांगते. यामुळे अतिरिक्त कामाशिवाय हजारो कनेक्शन्स हाताळणे शक्य होते.
epoll हे PHP चे फीचर नाही. ते Linux चे फीचर आहे. Go, Rust आणि Node.js सर्व याचा वापर करतात.
Fibers: पॉज बटण (The Pause Button)
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 मध्ये एक native Polling API आणते. आता, PHP कोणत्याही अतिरिक्त extensions शिवाय थेट epoll किंवा kqueue वापरू शकते.
निष्कर्ष (The Takeaway)
जर तुम्ही PHP-FPM सोबत Laravel वापरत असाल, तर तुम्हाला आज काहीही बदलण्याची गरज नाही.
पण हे समजून घ्या: Async ही जादू नाही. ती फक्त प्रतीक्षा वेळ (waiting time) व्यवस्थापित करण्याचा एक स्मार्ट मार्ग आहे.
फक्त कोड वापरून घेणे थांबवा. एक साधा स्क्रिप्ट चालवा. तो बिघडवून पहा. अशा प्रकारेच तुम्ही खरोखर शिकू शकता.
