PHP में कार्य कतारों के साथ काम करना: सरल से जटिल तक
आधुनिक वेब अनुप्रयोगों में, उपयोगकर्ता को प्रतीक्षा कराए बिना संसाधन-गहन या लंबी अवधि के कार्यों को करने की आवश्यकता अक्सर उत्पन्न होती है। ईमेल सूचनाएं भेजना, रिपोर्ट तैयार करना, छवियों को संसाधित करना, बाहरी API के साथ एकीकरण - ये सभी कार्य अतुल्यकालिक निष्पादन के लिए आदर्श हैं। यहीं पर कार्य कतारें (job queues) सहायक होती हैं। इस लेख में, हम विस्तार से देखेंगे कि PHP में कतारों के साथ कैसे काम करें और उन्हें अनुकूलित करें, सबसे सरल समाधानों से लेकर औद्योगिक उपकरणों तक।
कार्य कतार क्या है और इसकी आवश्यकता क्यों है?
कार्य कतार (job queue) एक तंत्र है जो किसी कार्य के निष्पादन को बाद के लिए स्थगित करने की अनुमति देता है। HTTP अनुरोध के दौरान तुरंत कार्य करने के बजाय, आप इसे एक कतार में रखते हैं। एक विशेष वर्कर (worker) या वर्करों का समूह कतार से कार्य निकालता है और उन्हें पृष्ठभूमि में संसाधित करता है।
कतारों का उपयोग करने के मुख्य लाभ:
- उपयोगकर्ता को तेज़ प्रतिक्रिया: उपयोगकर्ता को तुरंत प्रतिक्रिया मिलती है, जबकि भारी कार्य अतुल्यकालिक रूप से किया जाता है।
- स्केलेबिलिटी: आप समानांतर कार्य प्रसंस्करण के लिए कई वर्कर चला सकते हैं।
- विश्वसनीयता: यदि कोई कार्य विफल होता है (जैसे, अस्थायी त्रुटि के कारण), तो इसे बाद में दोहराया जा सकता है।
- मुख्य सर्वर से भार कम करना: पृष्ठभूमि प्रक्रियाएं नए HTTP अनुरोधों के प्रसंस्करण को अवरुद्ध नहीं करती हैं।
डेटाबेस-आधारित सरल कतार
PHP में कतार व्यवस्थित करने का सबसे सरल तरीका डेटाबेस (जैसे MySQL) में एक तालिका का उपयोग करना है। यह दृष्टिकोण अतिरिक्त सॉफ़्टवेयर स्थापित करने की आवश्यकता नहीं है और छोटी परियोजनाओं के लिए उपयुक्त है।
चरण 1: jobs तालिका बनाना
CREATE TABLE jobs ( id INT AUTO_INCREMENT PRIMARY KEY, queue_name VARCHAR(255) DEFAULT 'default', payload TEXT NOT NULL, status ENUM('pending', 'processing', 'completed', 'failed') DEFAULT 'pending', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, available_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, attempts INT DEFAULT 0);चरण 2: कतार में कार्य जोड़ना
function addJob(string $queueName, array $data): void { $pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'password'); $stmt = $pdo->prepare( "INSERT INTO jobs (queue_name, payload, available_at) VALUES (?, ?, NOW())" ); $stmt->execute([$queueName, json_encode($data)]);}
// उपयोग का उदाहरणaddJob('emails', ['to' => 'user@example.com', 'subject' => 'नमस्ते!']);चरण 3: वर्कर बनाना (worker.php)
// कार्यों को संसाधित करने के लिए अनंत लूपwhile (true) { $pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'password'); // पंक्ति लॉक के साथ कार्य कैप्चर करना $stmt = $pdo->prepare( "SELECT * FROM jobs WHERE status = 'pending' AND available_at <= NOW() ORDER BY id ASC LIMIT 1 FOR UPDATE" ); $stmt->execute(); $job = $stmt->fetch(PDO::FETCH_ASSOC); if ($job) { // "प्रसंस्करण में" के रूप में चिह्नित करें $updateStmt = $pdo->prepare("UPDATE jobs SET status = 'processing' WHERE id = ?"); $updateStmt->execute([$job['id']]); try { // कार्य निष्पादित करना $data = json_decode($job['payload'], true); processJob($data); // पूर्ण के रूप में चिह्नित करें $pdo->prepare("UPDATE jobs SET status = 'completed' WHERE id = ?") ->execute([$job['id']]); } catch (Exception $e) { // त्रुटि प्रबंधन $attempts = $job['attempts'] + 1; if ($attempts < 3) {