PHP में समवर्तीता और मल्टीथ्रेडिंग: एक व्यावहारिक मार्गदर्शिका

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

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

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

परिचय: PHP को समवर्तीता (Concurrency) की आवश्यकता क्यों है

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

इस लेख में, हम मुख्य दृष्टिकोणों पर चर्चा करेंगे: pthreads के माध्यम से मल्टीथ्रेडिंग, pcntl_fork के माध्यम से समानांतर प्रक्रियाएँ, ReactPHP की मदद से एसिंक्रोनस प्रोग्रामिंग, और PHP 8.1+ में आधुनिक Fibers। प्रत्येक विधि की अपनी ताकत और सीमाएँ हैं, जिन्हें हम व्यावहारिक उदाहरणों के साथ देखेंगे।

दृष्टिकोण 1: pthreads एक्सटेंशन के साथ मल्टीथ्रेडिंग

pthreads PHP में थ्रेड्स के साथ काम करने के लिए एक एक्सटेंशन है। यह केवल CLI संस्करण के लिए उपलब्ध है और इसे --enable-maintainer-zts फ्लैग के साथ बिल्ड करने की आवश्यकता होती है। थ्रेड्स मेमोरी साझा करते हैं, जो डेटा के कुशल आदान-प्रदान की अनुमति देता है, लेकिन लॉक (locks) के साथ सावधानी की आवश्यकता होती है।

स्थापना और कॉन्फ़िगरेशन

# pecl के माध्यम से स्थापना
pecl install pthreads

# php.ini में जाँच
extension=pthreads.so

उदाहरण: ऐरे का समानांतर प्रसंस्करण

<?php
class WorkerThread extends Thread {
    private $data;
    private $result;

    public function __construct($data) {
        $this->data = $data;
    }

    public function run() {
        // भारी ऑपरेशन का अनुकरण
        $this->result = array_map(function($item) {
            sleep(1); // प्रति आइटम 1 सेकंड
            return $item * 2;
        }, $this->data);
    }

    public function getResult() {
        return $this->result;
    }
}

// 5 थ्रेड बनाएँ
$threads = [];
$dataChunks = array_chunk(range(1, 100), 20);

foreach ($dataChunks as $chunk) {
    $thread = new WorkerThread($chunk);
    $thread->start();
    $threads[] = $thread;
}

// परिणाम एकत्र करना
$finalResult = [];
foreach ($threads as $thread) {
    $thread->join();
    $finalResult = array_merge($finalResult, $thread->getResult());
}

echo "100 के बजाय ~5 सेकंड में " . count($finalResult) . " आइटम संसाधित हुए।";

महत्वपूर्ण: pthreads वेब वातावरण (Apache/Nginx + mod_php) में काम नहीं करता है। इसका उपयोग केवल CLI स्क्रिप्ट, वर्कर्स और डेमॉन के लिए करें।

दृष्टिकोण 2: pcntl_fork के माध्यम से समानांतर प्रक्रियाएँ

फ़ंक्शन pcntl_fork() वर्तमान स्क्रिप्ट की प्रतिलिपि बनाकर एक चाइल्ड प्रक्रिया बनाता है। प्रक्रियाएँ मेमोरी में पृथक (isolated) होती हैं, जो थ्रेड्स की तुलना में अधिक सुरक्षित है, लेकिन इंटर-प्रोसेस कम्युनिकेशन (IPC) के लिए अतिरिक्त तंत्र की आवश्यकता होती है: मैसेज कतारें, साझा मेमोरी या सॉकेट।

उदाहरण: URL का समानांतर डाउनलोड

<?php
$urls = [
    'https://api.example.com/data1',
    'https://api.example.com/data2',
    'https://api.example.com/data3',
];

$pids = [];
foreach ($urls as $url) {
    $pid = pcntl_fork();
    if ($pid == -1) {
        die("fork त्रुटि");
    } elseif ($pid == 0) {
        // चाइल्ड प्रक्रिया
        $content = file_get_contents($url);
        file_put_contents('/tmp/' . md5($url) . '.json', $content);
        exit(0); // चाइल्ड प्रक्रिया को समाप्त करना महत्वपूर्ण
    } else {
        $pids[] = $pid;
    }
}

// सभी चाइल्ड प्रक्रियाओं के समाप्त होने की प्रतीक्षा करें
foreach ($pids as $pid) {
    pcntl_waitpid($pid, $status);
}

echo "सभी URL समानांतर रूप से डाउनलोड हो गए।";

सीमाएँ:

  • वेब सर्वर के साथ काम नहीं करता (केवल CLI)।
  • प्रत्येक प्रक्रिया पैरेंट की मेमोरी की खपत करती है।
  • साझा संसाधनों तक पहुँच को सिंक्रोनाइज़ करना कठिन है।

दृष्टिकोण 3: ReactPHP के साथ एसिंक्रोनसी

ReactPHP इवेंट-ड्रिवन प्रोग्रामिंग के लिए एक लाइब्रेरी है।

```

ब्लॉग

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