PHP में समवर्तीता और मल्टीथ्रेडिंग: आधुनिक दृष्टिकोण
PHP पारंपरिक रूप से कोड के सिंक्रोनस निष्पादन से जुड़ा हुआ है। हालाँकि, आधुनिक वेब एप्लिकेशन को फ़ाइल अपलोड से लेकर बड़े डेटा पार्सिंग तक, एक साथ कई कार्यों को संभालने की आवश्यकता होती है। इस लेख में, हम PHP में समवर्तीता और मल्टीथ्रेडिंग को लागू करने का तरीका समझेंगे, जिसमें बिल्ट-इन और तृतीय-पक्ष टूल का उपयोग किया जाएगा।
समवर्तीता और मल्टीथ्रेडिंग क्या है?
समवर्तीता एक प्रोग्राम की एक साथ कई कार्यों को निष्पादित करने की क्षमता है, उनके बीच स्विच करके। मल्टीथ्रेडिंग समवर्तीता का एक विशेष मामला है, जहाँ कार्य ऑपरेटिंग सिस्टम के अलग-अलग थ्रेड में निष्पादित होते हैं।
PHP 7.4 से पहले, थ्रेड के लिए कोई मूल समर्थन नहीं था। हालाँकि, pthreads और parallel एक्सटेंशन के आगमन के साथ-साथ प्रक्रियाओं के साथ काम करने में सुधार के साथ, स्थिति बदल गई है।
1. parallel एक्सटेंशन के साथ मल्टीथ्रेडिंग
parallel एक्सटेंशन PHP 7.4+ में थ्रेड के साथ काम करने का एक आधुनिक तरीका है। यह साझा मेमोरी का उपयोग करता है, जो थ्रेड के बीच कुशलतापूर्वक डेटा साझा करने की अनुमति देता है।
स्थापना:
pecl install parallelथ्रेड बनाने का उदाहरण:
<?phpuse parallel\\Runtime;
$runtime = new Runtime();$future = $runtime->run(function() { // भारी गणना $result = 0; for ($i = 0; $i < 1000000; $i++) { $result += sqrt($i); } return $result;});
echo "मुख्य थ्रेड काम करता रहता है...";$result = $future->value(); // परिणाम प्राप्त करेंecho "परिणाम: $result";?>parallel के लाभ:
- बिना अतिरिक्त निर्भरता के थ्रेड के लिए मूल समर्थन
- थ्रेड के बीच साझा मेमोरी
- क्लोज़र और ऑब्जेक्ट पास करने की क्षमता
नुकसान:
- PHP 7.4+ और ZTS (Zend Thread Safety) की आवश्यकता है
- Windows पर समर्थित नहीं है
- डीबगिंग में कठिनाइयाँ
2. प्रक्रियाओं के माध्यम से अतुल्यकालिकता: pcntl_fork
यदि आपको साझा मेमोरी की आवश्यकता नहीं है, तो आप pcntl_fork() का उपयोग करके प्रक्रियाओं का उपयोग कर सकते हैं। यह एक क्लासिक Unix दृष्टिकोण है।
<?php$pid = pcntl_fork();
if ($pid == -1) { die("प्रक्रिया बनाने में त्रुटि");} elseif ($pid) { // मूल प्रक्रिया echo "मूल: बाल प्रक्रिया की प्रतीक्षा कर रहा है..."; pcntl_wait($status); echo "मूल: बाल प्रक्रिया समाप्त हो गई";} else { // बाल प्रक्रिया echo "बाल: कार्य निष्पादित कर रहा हूँ..."; sleep(3); exit(0);}?>प्रक्रियाओं के साथ काम करने की विशेषताएँ:
- प्रत्येक प्रक्रिया की अपनी मेमोरी होती है
- डेटा साझा करने के लिए सॉकेट, साझा मेमोरी (shmop) या फ़ाइलों का उपयोग करें
pcntl_wait()के माध्यम से ज़ोंबी प्रक्रियाओं को संभालना आवश्यक है
3. अतुल्यकालिक फ़ंक्शन और ReactPHP के माध्यम से समवर्तीता
I/O कार्यों (नेटवर्क अनुरोध, फ़ाइल पढ़ना) के लिए, ReactPHP या Amp जैसी अतुल्यकालिक लाइब्रेरी का उपयोग करना अधिक कुशल है। वे थ्रेड नहीं बनाते हैं, लेकिन event loop के माध्यम से कार्यों को समवर्ती रूप से निष्पादित करने की अनुमति देते हैं।
ReactPHP के साथ उदाहरण:
<?phprequire 'vendor/autoload.php';
use React\\EventLoop\\Factory;use React\\Http\\Browser;
$loop = Factory::create();$client = new Browser($loop);
$promises = [];$urls = [ 'https://api.example.com/data1', 'https://api.example.com/data2', 'https://api.example.com/data3'];
foreach ($urls as $url) { $promises[] = $client->get($url);}
// सभी अनुरोधों की समानांतर प्रतीक्षा करें$results = [];foreach ($promises as $promise) { $results[] = $promise->wait();}
$loop->run();print_r($results);?>