This Is What I Learned As a Sync PHP Developer About Async PHP
मैंने सालों तक Laravel के साथ काम किया। मैंने sync PHP का उपयोग किया। एक रिक्वेस्ट आती है, एक प्रोसेस चलती है, और एक रिस्पॉन्स बाहर जाता है। मुझे कभी async की ज़रूरत नहीं पड़ी।
फिर मैंने नए PHP 8.6 Polling API के बारे में पढ़ा। इसने PHP द्वारा टास्क हैंडल करने के मेरे नज़रिए को बदल दिया।
यहाँ इसका विवरण दिया गया है कि async कैसे काम करता है।
The Problem with Blocking I/O
जब आप किसी API को कॉल करते हैं, तो आपका कोड इंतज़ार करता है।
उदाहरण: $response = Http::get('https://api.example.com');
अगर उस API में 300ms लगते हैं, तो आपका PHP प्रोसेस 300ms तक कुछ नहीं करता। यह 'sleep state' में रहता है। यह मेमोरी को घेरे रखता है और एक वर्कर स्लॉट (worker slot) को घेर लेता है। यदि आपके सभी वर्कर सो रहे हैं, तो आपका सर्वर नई रिक्वेस्ट स्वीकार करना बंद कर देगा।
The Async Solution
Async आपको उन 300ms के दौरान अन्य काम करने की अनुमति देता है। इंतज़ार करने के बजाय, आप अन्य टास्क चला सकते हैं।
लेकिन आपको कैसे पता चलेगा कि डेटा कब आ रहा है? यहीं पर kernel की भूमिका आती है।
The Evolution of Polling
select() PHP में PHP 4 से ही
stream_select()मौजूद है। यह kernel से पूछता है: "क्या इन sockets पर कोई डेटा तैयार है?" समस्या 'rescan tax' की है। यदि आपके पास 10,000 कनेक्शन हैं, तो आपको हर बार पूरी लिस्ट kernel को भेजनी होगी। यह धीमा है और इसकी सीमाएँ (limits) आ जाती हैं।epoll / kqueue यह एक kernel फीचर है, न कि भाषा (language) का फीचर। Linux
epollका उपयोग करता है। macOSkqueueका उपयोग करता है। पूरी लिस्ट को स्कैन करने के बजाय, kernel एक 'ready-list' बनाए रखता है। यह आपको केवल यह बताता है कि किन विशिष्ट sockets पर डेटा है। यह बिना किसी अतिरिक्त लागत के हज़ारों कनेक्शनों तक स्केल कर सकता है।Fibers (PHP 8.1) Fibers आपको call stack में कहीं भी किसी फंक्शन को रोकने (pause) की अनुमति देते हैं। एक Fiber अपने आप नहीं जागता। यह एक रुके हुए YouTube वीडियो की तरह है। इसे फिर से चलाने के लिए किसी को
$fiber->resume()कॉल करना होगा।
The Missing Link: PHP 8.6
Async I/O के लिए तीन भागों की आवश्यकता होती है: • Pause: Fibers (अब PHP core में) • Decide: The Event Loop (साधारण PHP कोड) • Know: Kernel Polling (कमी/गैप)
अब तक, PHP में पुराने टूल्स या C extensions का उपयोग किए बिना यह "जानने" का कोई नेटिव तरीका नहीं था कि कौन सा socket तैयार है।
PHP 8.6 इस कमी को दूर करता है। यह core में एक नेटिव Polling API लाता है। यह Linux पर स्वचालित रूप से epoll और Mac पर kqueue का उपयोग करेगा।
The Big Picture
Async कोई जादू नहीं है। एक event loop बस PHP कोड है जो यह तय करता है कि Fiber पर resume() कब कॉल करना है।
Fibers रोकने (pause) की क्षमता प्रदान करते हैं।
epoll यह जानने की बुद्धिमत्ता (intelligence) प्रदान करता है कि कब अनपॉज़ (unpause) करना है।
यदि आप केवल sync PHP का उपयोग करते हैं, तो आपको आज अपने Laravel ऐप्स को बदलने की आवश्यकता नहीं है। लेकिन इस मॉडल को समझने से ReactPHP या Amp जैसी async लाइब्रेरीज़ में महारत हासिल करना बहुत आसान हो जाता है।
केवल उपभोग न करें, निर्माण करें। यह देखने के लिए कि यह कैसे काम करता है, कोड को स्वयं चलाकर देखें।
