PHP में समवर्तीता और मल्टीथ्रेडिंग: उन्नत स्तर
PHP पारंपरिक रूप से स्क्रिप्ट के सिंक्रोनस निष्पादन से जुड़ा है, लेकिन आधुनिक वेब एप्लिकेशन एक साथ कई कार्यों को संसाधित करने की मांग करते हैं। समवर्तीता (concurrency) और मल्टीथ्रेडिंग (multithreading) प्रदर्शन में काफी सुधार करने, अनुरोध प्रसंस्करण को गति देने और सर्वर संसाधनों का कुशलतापूर्वक उपयोग करने की अनुमति देते हैं। इस लेख में, हम PHP में मल्टीथ्रेडिंग के साथ काम करने की उन्नत तकनीकों पर चर्चा करेंगे, जिसमें pthreads एक्सटेंशन, समानांतर प्रक्रियाएँ, एसिंक्रोनस कॉल और थ्रेड प्रबंधन शामिल हैं।
1. PHP में मल्टीथ्रेडिंग के मूल सिद्धांत: pthreads एक्सटेंशन
pthreads एक्सटेंशन PHP में थ्रेड्स के साथ काम करने का मुख्य उपकरण है। यह एक ही प्रक्रिया के अंतर्गत कई निष्पादन थ्रेड्स बनाने, चलाने और सिंक्रोनाइज़ करने की अनुमति देता है। महत्वपूर्ण: pthreads केवल CLI-मोड में काम करता है और थ्रेड सपोर्ट (ZTS — Zend Thread Safety) के साथ PHP बिल्ड की आवश्यकता होती है।
एक सरल थ्रेड बनाने का उदाहरण:
<?phpclass WorkerThread extends Thread { private $id; public function __construct($id) { $this->id = $id; } public function run() { echo "थ्रेड {$this->id} शुरू हुआ"; sleep(2); echo "थ्रेड {$this->id} समाप्त हुआ"; }}
$threads = [];for ($i = 1; $i <= 5; $i++) { $threads[$i] = new WorkerThread($i); $threads[$i]->start();}
foreach ($threads as $thread) { $thread->join();}?>विधि start() थ्रेड शुरू करती है, और join() इसके समाप्त होने की प्रतीक्षा करती है। join() के बिना, मुख्य थ्रेड चाइल्ड थ्रेड्स से पहले समाप्त हो सकता है।
2. थ्रेड सिंक्रोनाइज़ेशन और साझा संसाधन
मल्टीथ्रेडिंग के साथ काम करते समय सामान्य डेटा तक पहुँच को सिंक्रोनाइज़ करना महत्वपूर्ण है। PHP कई तंत्र प्रदान करता है: Mutex, Volatile और Threaded ऑब्जेक्ट।
Mutex (पारस्परिक अपवर्जन) — एक थ्रेड द्वारा संसाधन के साथ काम करने के दौरान अन्य थ्रेड्स के लिए उस तक पहुँच को अवरुद्ध करता है।
<?phpclass Counter extends Threaded { private $count = 0; public function increment() { $this->synchronized(function() { $this->count++; }); } public function getCount() { return $this->count; }}
class IncrementThread extends Thread { private $counter; public function __construct(Counter $counter) { $this->counter = $counter; } public function run() { for ($i = 0; $i < 1000; $i++) { $this->counter->increment(); } }}
$counter = new Counter();$threads = [];
for ($i = 0; $i < 10; $i++) { $threads[$i] = new IncrementThread($counter); $threads[$i]->start();}
foreach ($threads as $thread) { $thread->join();}
echo "अंतिम मान: " . $counter->getCount(); // 10000?>Volatile — यह सुनिश्चित करता है कि चर में परिवर्तन सभी थ्रेड्स को दिखाई दें। सरल डेटा प्रकारों के लिए Volatile का उपयोग करें।
$sharedFlag = new Volatile();$sharedFlag->flag = false;
// एक थ्रेड में$sharedFlag->flag = true;
// दूसरे थ्रेड मेंif ($sharedFlag->flag) { echo "फ्लैग सेट है";}3. समानांतर प्रक्रियाएँ और एसिंक्रोनस कार्य
यदि pthreads एक्सटेंशन उपलब्ध नहीं है (उदाहरण के लिए, साझा होस्टिंग पर), तो pcntl_fork() के माध्यम से समानांतर प्रक्रियाओं या ReactPHP या Amp जैसी एसिंक्रोनस लाइब्रेरीज़ का उपयोग किया जा सकता है।
pcntl_fork() — एक चाइल्ड प्रक्रिया बनाता है जो पैरेंट प्रक्रिया के समानांतर चलती है।
<?php$pid = pcntl_fork();if ($pid == -1) { die("प्रक्रिया बनाने में विफल");} elseif ($pid)