परिचय: PHP में कंकरेंसी एक मिथक क्यों नहीं है
\nPHP को पारंपरिक रूप से एक सिंक्रोनस भाषा माना जाता है, जहां प्रत्येक अनुरोध क्रमिक रूप से संसाधित होता है। लेकिन आधुनिक एप्लिकेशन - वीडियो प्रोसेसिंग से लेकर बड़े डेटा पार्सिंग तक - को एक साथ कई कार्यों को निष्पादित करने की आवश्यकता होती है। कंकरेंसी के बिना, आप "परफॉर्मेंस वॉल" से टकरा सकते हैं, जहां एक शक्तिशाली सर्वर भी I/O ऑपरेशन पूरा होने की प्रतीक्षा में निष्क्रिय रहता है।
\nइस लेख में, हम PHP में कंकरेंसी के साथ काम करने की एडवांस्ड तकनीकों को समझेंगे: सिस्टम कॉल से लेकर कर्नेल-लेवल एक्सटेंशन तक। आप सीखेंगे कि PHP को समानांतर रूप से कैसे काम कराया जाए, बिना संसाधनों पर नियंत्रण खोए।
\n\n1. मूल बातें: PHP में प्रक्रियाएं बनाम थ्रेड
\nकोड में गोता लगाने से पहले, PHP के संदर्भ में प्रक्रियाओं और थ्रेड के बीच अंतर को समझना महत्वपूर्ण है।
\n- \n
- प्रक्रियाएं - अलग-अलग इंस्टेंस, प्रत्येक का अपना मेमोरी होता है।
pcntl_fork()के माध्यम से बनाई जाती हैं। भारी कार्यों के लिए उपयुक्त, लेकिन इंटर-प्रोसेस कम्युनिकेशन (IPC) की आवश्यकता होती है। \n - थ्रेड - एक ही प्रक्रिया के अंदर हल्के "उप-कार्य", जो मेमोरी साझा करते हैं।
pthreadsएक्सटेंशन के माध्यम से कार्यान्वित किए जाते हैं। साझा डेटा के साथ काम करने के लिए आदर्श, लेकिन सिंक्रोनाइज़ेशन की आवश्यकता होती है। \n
एडवांस्ड स्तर के लिए, दोनों दृष्टिकोणों को संयोजित करना महत्वपूर्ण है। उदाहरण के लिए, महत्वपूर्ण कार्यों को अलग करने के लिए फोर्क का उपयोग करें, और एक ही संदर्भ में समानांतर प्रसंस्करण के लिए थ्रेड का उपयोग करें।
\n\n1.1 pcntl_fork() के माध्यम से समानांतर प्रक्रियाएं
\nसिस्टम कॉल pcntl_fork() एक चाइल्ड प्रक्रिया बनाता है जो पैरेंट की मेमोरी को कॉपी करता है। आइए कई URL के समानांतर प्रसंस्करण का एक उदाहरण देखें:
<?php\n$urls = ['https://api.example.com/data1', 'https://api.example.com/data2', 'https://api.example.com/data3'];\n$pids = [];\n\nforeach ($urls as $url) {\n $pid = pcntl_fork();\n if ($pid == -1) {\n die('प्रक्रिया बनाने में विफल');\n } elseif ($pid) {\n // पैरेंट प्रक्रिया: PID को सेव करें\n $pids[] = $pid;\n } else {\n // चाइल्ड प्रक्रिया: डाउनलोड करें\n $data = file_get_contents($url);\n file_put_contents('/tmp/' . md5($url) . '.json', $data);\n exit(0); // चाइल्ड प्रक्रिया समाप्त करें\n }\n}\n\n// सभी प्रक्रियाओं के पूरा होने की प्रतीक्षा करें\nforeach ($pids as $pid) {\n pcntl_waitpid($pid, $status);\n}\necho "सभी URL समानांतर रूप से संसाधित हो गए!";\n?>\nमहत्वपूर्ण: fork() के बाद, चाइल्ड प्रक्रियाएं सभी खुले फ़ाइल डिस्क्रिप्टर और डेटाबेस कनेक्शन को इनहेरिट करती हैं। विवादों से बचने के लिए चाइल्ड प्रक्रिया में उन्हें स्पष्ट रूप से बंद करें।
\n\n2. ReactPHP और Amp के साथ एसिंक्रोनस कार्य
\nवेब एप्लिकेशन के लिए जहां रिएक्टिविटी महत्वपूर्ण है, इवेंट-ड्रिवन लूप लाइब्रेरी का उपयोग करें। ReactPHP और Amp आपको अलग-अलग प्रक्रियाएं बनाए बिना नॉन-ब्लॉकिंग ऑपरेशन करने की अनुमति देते हैं।
\n\n2.1 ReactPHP के साथ उदाहरण
\nComposer के माध्यम से लाइब्रेरी इंस्टॉल करें: composer require react/react। नीचे एक एसिंक्रोनस HTTP क्लाइंट है जो एक साथ तीन अनुरोध भेजता है:
<?php\nrequire 'vendor/autoload.php';\n\nuse React\\EventLoop\\Factory;\nuse React\\HttpClient\\Client;\n\n$loop = Factory::create();\n$client = new Client($loop);\n\n$urls = ['http://example.com', 'http://example.org', 'http://example.net'];\n$promises = [];\n\nforeach ($urls as $url) {\n $request = $client->request('GET', $url);\n $request->on('response', function ($response) use ($url) {\n echo "{$url} से प्रतिक्रिया: " . $response->getCode() . PHP_EOL;\n });\n $request->end();\n}\n\n$loop->run();\n?>\nReactPHP एक एकल इवेंट लूप बनाता है जो बिना ब्लॉक किए सभी अनुरोधों को संभालता है। यह API गेटवे या माइक्रोसर्विसेज के लिए आदर्श है जहां प्रतिक्रिया की गति महत्वपूर्ण है।
\n\n3. pthreads के साथ थ्रेड प्रबंधन (ZTS बिल्ड)
\npthreads एक्सटेंशन PHP में वास्तविक मल्टीथ्रेडिंग प्राप्त करने का एकमात्र तरीका है।
ब्लॉग
पुस्तक अनुशंसाएँ
यह भी पढ़ें