PHP में एसिंक्रोनस प्रोग्रामिंग का परिचय
परंपरागत रूप से PHP को एक सिंक्रोनस भाषा माना जाता है: प्रत्येक अनुरोध क्रमिक रूप से निष्पादित होता है, I/O ऑपरेशन (जैसे फ़ाइल पढ़ना या डेटाबेस क्वेरी) पूरा होने तक निष्पादन को ब्लॉक करता है। हालांकि, उच्च-लोड वेब एप्लिकेशन और माइक्रोसर्विसेज की बढ़ती लोकप्रियता के साथ, प्रक्रियाओं की संख्या बढ़ाए बिना दसियों हज़ार समवर्ती कनेक्शनों को संभालने की आवश्यकता उत्पन्न हुई। एसिंक्रोनस प्रोग्रामिंग इस समस्या को हल करती है, जिससे एक ही थ्रेड के भीतर ऑपरेशन को समवर्ती रूप से निष्पादित किया जा सकता है।
इस गाइड में, हम समझेंगे कि PHP में एसिंक्रोनसिटी कैसे काम करती है, कौन से उपकरण उपलब्ध हैं, और नॉन-ब्लॉकिंग एप्लिकेशन कैसे बनाएं। आप जनरेटर, कोरूटीन, ReactPHP, Amp और Swoole लाइब्रेरीज़, साथ ही नए Fibers एक्सटेंशन के बारे में जानेंगे।
एसिंक्रोनसिटी के मूल सिद्धांत: Event Loop और नॉन-ब्लॉकिंग I/O
एसिंक्रोनस प्रोग्रामिंग Event Loop (इवेंट लूप) की अवधारणा पर आधारित है। यह एक अनंत लूप है जो इवेंट्स की प्रतीक्षा करता है और उन्हें संसाधित करता है: नेटवर्क अनुरोध, I/O ऑपरेशन का पूरा होना, टाइमर। ऑपरेशन पूरा होने की प्रतीक्षा करने के बजाय, कोड एक कॉलबैक (callback) रजिस्टर करता है, जो डेटा तैयार होने पर निष्पादित होता है। इससे प्रतीक्षा में CPU समय बर्बाद नहीं होता।
PHP पारंपरिक रूप से ब्लॉकिंग फ़ंक्शन (जैसे file_get_contents() या sleep()) का उपयोग करता है। एसिंक्रोनस कार्य के लिए, उन्हें नॉन-ब्लॉकिंग विकल्पों से बदलना होगा। ReactPHP लाइब्रेरी का उपयोग करते हुए एक सरल उदाहरण यहां दिया गया है:
<?phprequire 'vendor/autoload.php';
use React\\EventLoop\\Factory;use React\\Promise\\Promise;
$loop = Factory::create();
// फ़ाइल का एसिंक्रोनस पठन$promise = new Promise(function ($resolve, $reject) use ($loop) { $loop->addTimer(0.001, function () use ($resolve) { $content = file_get_contents('/etc/hosts'); $resolve($content); });});
$promise->then(function ($data) { echo "पढ़ा गया: " . strlen($data) . " बाइट्स";});
echo "यह कोड फ़ाइल पढ़ने की प्रतीक्षा किए बिना तुरंत निष्पादित होगा";$loop->run();?>इस उदाहरण में, addTimer एक कार्य रजिस्टर करता है जो लूप के अगले टिक में निष्पादित होगा। Event Loop ब्लॉक नहीं होता है, और हम तुरंत संदेश देखते हैं, जबकि पढ़ने का परिणाम बाद में दिखाई देता है।
जनरेटर और कोरूटीन: निष्पादन प्रवाह का प्रबंधन
जनरेटर (yield) PHP 5.5 में दिखाई दिए और फ़ंक्शन के निष्पादन को रोककर मध्यवर्ती मान लौटाने की अनुमति देते हैं। इनके आधार पर कोरूटीन बनाए जाते हैं - हल्के थ्रेड जो स्वेच्छा से नियंत्रण छोड़ सकते हैं। Event Loop के साथ मिलकर, जनरेटर कोड लिखने की अनुमति देते हैं जो सिंक्रोनस दिखता है लेकिन एसिंक्रोनस रूप से निष्पादित होता है।
आइए Amp लाइब्रेरी के साथ एक उदाहरण देखें, जो कोरूटीन का उपयोग करती है:
<?phprequire 'vendor/autoload.php';
use Amp\\Loop;use Amp\\Delayed;
// एसिंक्रोनस कोरूटीन$coroutine = function () { echo "कोरूटीन की शुरुआत"; // बिना ब्लॉक किए 1 सेकंड के लिए रुकें yield new Delayed(1000); echo "1 सेकंड बीत गया"; yield new Delayed(500); echo "0.5 सेकंड और बीत गया";};
Loop::run(function () use ($coroutine) { // कोरूटीन चलाएं $result = yield from $coroutine(); echo "कोरूटीन पूर्ण हुआ";});?>इस कोड में, yield new Delayed(1000) कोरूटीन के निष्पादन को रोकता है, नियंत्रण वापस Event Loop को देता है। 1 सेकंड के बाद, निष्पादन उसी स्थान से फिर से शुरू होता है। यह नई प्रक्रियाएं बनाए बिना एक साथ हजारों ऐसे कोरूटीन को संभालने की अनुमति देता है।
एसिंक्रोनस PHP के लिए लाइब्रेरीज़ और उपकरण
PHP में एसिंक्रोनसिटी के साथ काम करने के लिए कई परिपक्व लाइब्रेरीज़ मौजूद हैं। आइए तीन सबसे लोकप्रिय पर नज़र डालें।
ReactPHP
ReactPHP सबसे पुरानी और सबसे प्रसिद्ध लाइब्रेरी है। यह Event Loop, Promise (JavaS के समान) प्रदान करती है।
```