PHP के लिए कार्य कतारें: RabbitMQ, Gearman और PhpAmqpLib
आधुनिक वेब एप्लिकेशन में उपयोगकर्ता को प्रतिक्रिया देने की गति महत्वपूर्ण है। लंबी प्रक्रियाएँ (ईमेल भेजना, PDF जनरेट करना, इमेज प्रोसेसिंग, डेटा पार्सिंग) को मुख्य निष्पादन प्रवाह को ब्लॉक नहीं करना चाहिए। इस समस्या का समाधान कार्य कतारें (job queues) हैं। वे पृष्ठभूमि कार्यों को वर्कर्स को सौंपने की अनुमति देती हैं, जो एसिंक्रोनस रूप से काम करते हैं।
PHP पारिस्थितिकी तंत्र में कतारों को व्यवस्थित करने के लिए कई परिपक्व समाधान मौजूद हैं। आइए तीन प्रमुख टूल पर विचार करें: PhpAmqpLib (RabbitMQ के लिए क्लाइंट), Gearman और इसके AMQP प्रोटोकॉल के माध्यम से मूल RabbitMQ।
PHP में कार्य कतारों की आवश्यकता क्यों है?
सामान्य परिदृश्य: उपयोगकर्ता वेबसाइट पर पंजीकरण करता है। सिस्टम को चाहिए:
- डेटाबेस में डेटा सहेजना
- स्वागत ईमेल भेजना
- PDF अनुबंध बनाना
- स्पैम जांच शुरू करना
कतार के बिना, उपयोगकर्ता सभी प्रक्रियाओं के पूरा होने तक प्रतीक्षा करता है। कतार के साथ:
- मुख्य प्रक्रिया डेटा सहेजती है और कार्य को कतार में भेजती है
- उपयोगकर्ता को तुरंत "सफल" प्रतिक्रिया मिलती है
- पृष्ठभूमि वर्कर्स बारी-बारी से कार्यों को संसाधित करते हैं
इससे UX और सिस्टम स्थिरता में सुधार होता है।
1. RabbitMQ और PhpAmqpLib
RabbitMQ एक शक्तिशाली संदेश ब्रोकर है जो AMQP 0-9-1 प्रोटोकॉल का समर्थन करता है। PhpAmqpLib बाहरी एक्सटेंशन के बिना RabbitMQ के साथ काम करने के लिए शुद्ध PHP क्लाइंट कार्यान्वयन है।
स्थापना
composer require php-amqplib/php-amqplibउदाहरण: कार्य भेजना (Producer)
<?phprequire_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\\Connection\\AMQPStreamConnection;use PhpAmqpLib\\Message\\AMQPMessage;
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');$channel = $connection->channel();
// कतार घोषित करें (यदि मौजूद नहीं है तो बनाई जाएगी)$channel->queue_declare('email_queue', false, true, false, false);
$data = json_encode([ 'to' => 'user@example.com', 'subject' => 'स्वागत', 'body' => 'आपका स्वागत है!']);
$msg = new AMQPMessage($data, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);$channel->basic_publish($msg, '', 'email_queue');
echo " [x] भेजा गया: $data";
$channel->close();$connection->close();उदाहरण: वर्कर (Consumer)
<?phprequire_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\\Connection\\AMQPStreamConnection;
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');$channel = $connection->channel();
$channel->queue_declare('email_queue', false, true, false, false);
echo " [*] कार्यों की प्रतीक्षा। बाहर निकलने के लिए CTRL+C दबाएँ";
$callback = function ($msg) { $data = json_decode($msg->body, true); // ईमेल भेजने का अनुकरण echo " [x] {$data['to']} को ईमेल भेजा जा रहा है: {$data['subject']}"; sleep(2); // कार्य का अनुकरण echo " [x] तैयार"; $msg->ack(); // प्रसंस्करण की पुष्टि};
$channel->basic_qos(null, 1, null);$channel->basic_consume('email_queue', '', false, false, false, false, $callback);
while ($channel->is_consuming()) { $channel->wait();}लाभ: विश्वसनीयता, जटिल रूटिंग (topics, headers) का समर्थन, संदेशों की स्थायित्व, क्लस्टरिंग।
कमियाँ: RabbitMQ सर्वर (Erlang, वेब इंटरफ़ेस के माध्यम से प्रबंधन) की स्थापना और कॉन्फ़िगरेशन की आवश्यकता है।
2. Gearman
Gearman एक वितरित कार्य प्रणाली है। इसमें तीन घटक होते हैं: क्लाइंट (कार्य भेजता है), वर्कर (निष्पादित करता है), सर्वर (डिस्पैचर)। यह बाइनरी प्रोटोकॉल के माध्यम से काम करता है।
स्थापना
पहले Gearman सर्वर और PHP एक्सटेंशन स्थापित करें:
sudo apt-get install gearman-job-s