PHP में समवर्तीता और मल्टीथ्रेडिंग का परिचय
\nPHP पारंपरिक रूप से एक सिंक्रोनस और सिंगल-थ्रेडेड भाषा मानी जाती है। हालाँकि, आधुनिक वेब एप्लिकेशन को एक साथ कई कार्यों को संसाधित करने की आवश्यकता होती है: फ़ाइल अपलोड, API के साथ काम करना, कतारों को संसाधित करना। PHP में समवर्तीता और मल्टीथ्रेडिंग स्क्रिप्ट निष्पादन को गति देकर और एप्लिकेशन की प्रतिक्रियाशीलता बढ़ाकर इन समस्याओं को हल करने की अनुमति देते हैं।
\nइस लेख में, हम मुख्य अवधारणाओं पर चर्चा करेंगे: समवर्तीता के मूल सिद्धांतों से लेकर pthreads और parallel एक्सटेंशन के व्यावहारिक अनुप्रयोग तक। आप सीखेंगे कि कार्यों के समानांतर निष्पादन को कैसे व्यवस्थित करें, डेटा रेस से कैसे बचें और अपने PHP कोड के प्रदर्शन को कैसे बढ़ाएँ।
समवर्तीता और मल्टीथ्रेडिंग की मूल अवधारणाएँ
\nसिंक्रोनस बनाम एसिंक्रोनस
\nसिंक्रोनस मॉडल में, PHP कोड को सख्ती से क्रमिक रूप से निष्पादित करता है। यदि एक स्क्रिप्ट HTTP अनुरोध करती है, तो प्रतिक्रिया प्राप्त होने तक निष्पादन रुक जाता है। एसिंक्रोनसिटी कार्यों को उनके पूरा होने की प्रतीक्षा किए बिना शुरू करने की अनुमति देती है।
\nसिंक्रोनस कोड का उदाहरण:
\n<?php\n$result1 = file_get_contents('https://api.example.com/data1');\n$result2 = file_get_contents('https://api.example.com/data2');\n// दोनों अनुरोध क्रमिक रूप से निष्पादित होते हैं\n?>\n\nथ्रेड्स और प्रोसेसेस
\n- \n
- प्रक्रिया — अपने स्वयं के एड्रेस स्पेस के साथ प्रोग्राम की एक पृथक प्रतिलिपि। \n
- थ्रेड — प्रक्रिया के अंदर निष्पादन की एक हल्की इकाई, जो मेमोरी साझा करती है। \n
PHP में, मल्टीथ्रेडिंग थ्रेड्स के माध्यम से कार्यान्वित की जाती है। उनके साथ काम करने के लिए विशेष एक्सटेंशन की आवश्यकता होती है, क्योंकि PHP का मानक बिल्ड थ्रेड्स का समर्थन नहीं करता है।
\n\nडेटा रेस और सिंक्रोनाइज़ेशन
\nजब कई थ्रेड साझा डेटा के साथ काम करते हैं, तो रेस कंडीशन (race condition) उत्पन्न हो सकती है। इसे रोकने के लिए म्यूटेक्स (mutex), लॉक और एटॉमिक ऑपरेशन का उपयोग किया जाता है।
\n\nPHP में मल्टीथ्रेडिंग के लिए उपकरण
\npthreads एक्सटेंशन
\npthreads — थ्रेड्स के साथ काम करने के लिए पहले एक्सटेंशन में से एक है। यह Thread, Worker और Pool क्लास प्रदान करता है। महत्वपूर्ण: एक्सटेंशन केवल CLI मोड में काम करता है और इसके लिए ZTS (Zend Thread Safety) PHP बिल्ड की आवश्यकता होती है।
एक सरल थ्रेड का उदाहरण:
\n<?php\nclass MyThread extends Thread {\n public function run() {\n echo "थ्रेड शुरू हुआ\\n";\n }\n}\n$thread = new MyThread();\n$thread->start();\n$thread->join();\n?>\n\nparallel एक्सटेंशन
\nparallel — एक अधिक आधुनिक एक्सटेंशन है, जो PHP 7.4 में दिखाई दिया। यह अधिक सुविधाजनक और सुरक्षित है। थ्रेड्स के बीच डेटा स्थानांतरित करने के लिए चैनल (channels) के माध्यम से काम करता है।
parallel के साथ उदाहरण:
\n<?php\n$runtime = new \\parallel\\Runtime();\n$future = $runtime->run(function(){\n return "समानांतर थ्रेड से नमस्ते!";\n});\necho $future->value(); // परिणाम प्राप्त करें\n?>\n\nReactPHP और Amp के माध्यम से एसिंक्रोनसिटी
\nयदि आपको वास्तविक मल्टीथ्रेडिंग की आवश्यकता नहीं है, लेकिन समवर्तीता की आवश्यकता है, तो एसिंक्रोनस इनपुट-आउटपुट लाइब्रेरी का उपयोग करें:
\n- \n
- ReactPHP — इवेंट लूप के साथ इवेंट-ओरिएंटेड लाइब्रेरी। \n
- Amp — PHP के लिए async/await, JavaScript के समान। \n
व्यावहारिक उदाहरण और सर्वोत्तम अभ्यास
\nउदाहरण: URL की समानांतर प्रोसेसिंग
\nमान लीजिए, आपको 10 साइटों की उपलब्धता की जाँच करनी है। सिंक्रोनस रूप से इसमें बहुत समय लगेगा। गति बढ़ाने के लिए parallel का उपयोग करें:
<?php\n$urls = [\n 'https://google.com',\n 'https://yandex.ru',\n 'https://github.com'\n];\n\n$runtimes = [];\n$futures = [];\n\nforeach ($urls as $url) {\n $runtime = new \\parallel\\Runtime();\n $runtimes[] = $runtime;\n $futures[] = $runtime->run(function($url) {\n $ch = curl_init($url);\n curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n curl_setopt($ch, CURLOPT_TIMEOUT, 5);