PHP में समवर्तीता और मल्टीथ्रेडिंग: A से Z तक

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

PHP में समवर्तीता और मल्टीथ्रेडिंग का परिचय

\n

PHP पारंपरिक रूप से एक सिंक्रोनस और सिंगल-थ्रेडेड भाषा मानी जाती है। हालाँकि, आधुनिक वेब एप्लिकेशन को एक साथ कई कार्यों को संसाधित करने की आवश्यकता होती है: फ़ाइल अपलोड, API के साथ काम करना, कतारों को संसाधित करना। PHP में समवर्तीता और मल्टीथ्रेडिंग स्क्रिप्ट निष्पादन को गति देकर और एप्लिकेशन की प्रतिक्रियाशीलता बढ़ाकर इन समस्याओं को हल करने की अनुमति देते हैं।

\n

इस लेख में, हम मुख्य अवधारणाओं पर चर्चा करेंगे: समवर्तीता के मूल सिद्धांतों से लेकर pthreads और parallel एक्सटेंशन के व्यावहारिक अनुप्रयोग तक। आप सीखेंगे कि कार्यों के समानांतर निष्पादन को कैसे व्यवस्थित करें, डेटा रेस से कैसे बचें और अपने PHP कोड के प्रदर्शन को कैसे बढ़ाएँ।

\n\n

समवर्तीता और मल्टीथ्रेडिंग की मूल अवधारणाएँ

\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
\n

PHP में, मल्टीथ्रेडिंग थ्रेड्स के माध्यम से कार्यान्वित की जाती है। उनके साथ काम करने के लिए विशेष एक्सटेंशन की आवश्यकता होती है, क्योंकि PHP का मानक बिल्ड थ्रेड्स का समर्थन नहीं करता है।

\n\n

डेटा रेस और सिंक्रोनाइज़ेशन

\n

जब कई थ्रेड साझा डेटा के साथ काम करते हैं, तो रेस कंडीशन (race condition) उत्पन्न हो सकती है। इसे रोकने के लिए म्यूटेक्स (mutex), लॉक और एटॉमिक ऑपरेशन का उपयोग किया जाता है।

\n\n

PHP में मल्टीथ्रेडिंग के लिए उपकरण

\n

pthreads एक्सटेंशन

\n

pthreads — थ्रेड्स के साथ काम करने के लिए पहले एक्सटेंशन में से एक है। यह Thread, Worker और Pool क्लास प्रदान करता है। महत्वपूर्ण: एक्सटेंशन केवल CLI मोड में काम करता है और इसके लिए ZTS (Zend Thread Safety) PHP बिल्ड की आवश्यकता होती है।

\n

एक सरल थ्रेड का उदाहरण:

\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\n

parallel एक्सटेंशन

\n

parallel — एक अधिक आधुनिक एक्सटेंशन है, जो PHP 7.4 में दिखाई दिया। यह अधिक सुविधाजनक और सुरक्षित है। थ्रेड्स के बीच डेटा स्थानांतरित करने के लिए चैनल (channels) के माध्यम से काम करता है।

\n

parallel के साथ उदाहरण:

\n
<?php\n$runtime = new \\parallel\\Runtime();\n$future = $runtime->run(function(){\n    return "समानांतर थ्रेड से नमस्ते!";\n});\necho $future->value(); // परिणाम प्राप्त करें\n?>
\n\n

ReactPHP और Amp के माध्यम से एसिंक्रोनसिटी

\n

यदि आपको वास्तविक मल्टीथ्रेडिंग की आवश्यकता नहीं है, लेकिन समवर्तीता की आवश्यकता है, तो एसिंक्रोनस इनपुट-आउटपुट लाइब्रेरी का उपयोग करें:

\n
    \n
  • ReactPHP — इवेंट लूप के साथ इवेंट-ओरिएंटेड लाइब्रेरी।
  • \n
  • Amp — PHP के लिए async/await, JavaScript के समान।
  • \n
\n\n

व्यावहारिक उदाहरण और सर्वोत्तम अभ्यास

\n

उदाहरण: URL की समानांतर प्रोसेसिंग

\n

मान लीजिए, आपको 10 साइटों की उपलब्धता की जाँच करनी है। सिंक्रोनस रूप से इसमें बहुत समय लगेगा। गति बढ़ाने के लिए parallel का उपयोग करें:

\n
<?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);                

ब्लॉग

पुस्तक अनुशंसाएँ