परिचय: PHP डेवलपर को कंकरेंसी के बारे में क्यों सोचना चाहिए?
\n\nएक समय था जब PHP को "तेज़ स्क्रिप्ट" वाली भाषा माना जाता था, जहाँ सब कुछ क्रम से चलता था और किसी समानांतर काम की ज़रूरत नहीं होती थी। समय बदल गया है। आज हम PHP में हाई-लोड API, टास्क क्यू, वेब सॉकेट और माइक्रोसर्विसेज़ बना रहे हैं। और तब सवाल उठता है: PHP को एक साथ कई काम कैसे कराएं, बिना सब कुछ ब्लॉक किए?
\n\nइस लेख में हम PHP में कंकरेंसी के तीन तरीकों को समझेंगे: क्लासिकल थ्रेड्स (pthreads), हल्की गोरूटीन्स (Fiber) और आधुनिक async/await सिंटैक्स। आप असली कोड उदाहरण देखेंगे, जानेंगे कि कहाँ कौन सा टूल इस्तेमाल करें और 2025 में क्या चुनना चाहिए।
\n\nअगर आप डेटा प्रोसेसिंग के लिए PHP में समानांतर निष्पादन ढूंढ रहे हैं, या समझना चाहते हैं कि PHP गोरूटीन्स थ्रेड्स से कैसे अलग हैं — तो आप सही जगह पर हैं।
\n\n1. PHP में मल्टीथ्रेडिंग: pthreads — पुराना, लेकिन शक्तिशाली
\n\nयह क्या है और कैसे काम करता है?
\npthreads एक एक्सटेंशन है जो PHP को असली OS थ्रेड्स बनाने की क्षमता देता है। हर थ्रेड अपनी मेमोरी के साथ Zend Engine का एक अलग इंस्टेंस होता है, लेकिन Threaded-ऑब्जेक्ट्स के ज़रिए डेटा शेयर कर सकता है।
एक महत्वपूर्ण बात: pthreads केवल CLI मोड में काम करता है और वेब एनवायरनमेंट (Apache/Nginx mod_php) में सपोर्ट नहीं होता। लेकिन यह प्रोसेसर स्तर पर असली समानांतरता (सिर्फ कंकरेंसी नहीं) पाने का एकमात्र तरीका है।
\n\nउदाहरण: URL को समानांतर रूप से पार्स करना
\n<?php\n// सुनिश्चित करें कि pthreads एक्सटेंशन इंस्टॉल है\nclass UrlFetcher extends Thread {\n private $url;\n private $result;\n\n public function __construct(string $url) {\n $this->url = $url;\n }\n\n public function run() {\n // अलग थ्रेड में चलता है\n $this->result = file_get_contents($this->url);\n }\n\n public function getResult() {\n return $this->result;\n }\n}\n\n$urls = ['https://api.example.com/1', 'https://api.example.com/2', 'https://api.example.com/3'];\n$threads = [];\n\nforeach ($urls as $url) {\n $thread = new UrlFetcher($url);\n $thread->start(); // थ्रेड शुरू करें\n $threads[] = $thread;\n}\n\n// परिणाम इकट्ठा करें\nforeach ($threads as $thread) {\n $thread->join(); // पूरा होने का इंतज़ार करें\n echo $thread->getResult() . PHP_EOL;\n}\n?>\n\nयह कोड तीन थ्रेड चलाता है, हर एक अपना URL डाउनलोड करता है। निष्पादन का समय लगभग सबसे धीमे रिक्वेस्ट के बराबर होता है, तीनों के योग के बराबर नहीं। यह PHP में समानांतर निष्पादन का बेहतरीन उदाहरण है।
\n\npthreads का उपयोग कब करें?
\n- \n
- भारी CPU-कार्य (इमेज प्रोसेसिंग, एन्क्रिप्शन, PDF रेंडरिंग)। \n
- CLI स्क्रिप्ट्स में बड़े डेटा सेट का पार्सिंग। \n
- जब असली समानांतरता चाहिए, न कि कोऑपरेटिव मल्टीटास्किंग। \n
2. PHP में गोरूटीन्स: Fiber — हल्कापन और नियंत्रण
\n\nFiber क्या है?
\nPHP 8.1 से शुरू, भाषा में Fiber आया — यह Go की गोरूटीन्स या Python की कोरूटीन्स का एनालॉग है। थ्रेड्स के विपरीत, Fiber कोई अलग OS प्रोसेस नहीं बनाता। यह एक हल्की निष्पादन इकाई है जो एक ही थ्रेड में चलती है और डेवलपर के कमांड पर स्विच होती है।
\n\nमुख्य विचार: आप खुद तय करते हैं कि कब मौजूदा Fiber को रोकना है और दूसरे को नियंत्रण देना है। इसे कोऑपरेटिव मल्टीटास्किंग कहते हैं। I/O ऑपरेशंस (API कॉल, फ़ाइल रीडिंग, DB काम) के लिए यह आदर्श है।
\n\nउदाहरण: डायरेक्टरी का एसिंक्रोनस ट्रैवर्सल
\n<?php\nfunction readFileAsync(string $path): Fiber {\n return new Fiber(function () use ($path) {\n $handle = fopen($path, 'r');\n $content = '';\n while (!feof($handle)) {\n $chunk = fread($handle, 4096);\n $content .= $chunk;\n // Fiber को रोकें ताकि दूसरे को मौका मिले