قوائم المهام لـ PHP: RabbitMQ و Gearman و PhpAmqpLib

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

قوائم المهام لـ PHP: RabbitMQ و Gearman و PhpAmqpLib

في تطبيقات الويب الحديثة، سرعة الاستجابة للمستخدم أمر بالغ الأهمية. العمليات الطويلة (إرسال البريد الإلكتروني، إنشاء PDF، معالجة الصور، تحليل البيانات) يجب ألا تعيق مسار التنفيذ الرئيسي. حل هذه المشكلة هو قوائم المهام (job queues). فهي تسمح بتفويض المهام الخلفية إلى عمال يعملون بشكل غير متزامن.

في نظام PHP البيئي، توجد عدة حلول ناضجة لتنظيم قوائم المهام. سننظر في ثلاث أدوات رئيسية: PhpAmqpLib (عميل لـ RabbitMQ)، Gearman، و RabbitMQ الأصلي عبر بروتوكول AMQP الخاص به.



لماذا نحتاج إلى قوائم المهام في PHP؟

سيناريو نموذجي: يسجل مستخدم في الموقع. يجب على النظام:

  • حفظ البيانات في قاعدة البيانات
  • إرسال بريد ترحيبي
  • إنشاء عقد PDF
  • بدء فحص البريد العشوائي

بدون قائمة انتظار، ينتظر المستخدم حتى اكتمال جميع العمليات. مع قائمة الانتظار:

  • العملية الرئيسية تحفظ البيانات وترسل المهمة إلى قائمة الانتظار
  • يتلقى المستخدم ردًا فوريًا "تم بنجاح"
  • يقوم العمال الخلفيون بمعالجة المهام واحدة تلو الأخرى

هذا يحسن تجربة المستخدم واستقرار النظام.



1. RabbitMQ و PhpAmqpLib

RabbitMQ هو وسيط رسائل قوي يدعم بروتوكول AMQP 0-9-1. PhpAmqpLib هو تطبيق PHP خالص لعميل للعمل مع RabbitMQ بدون إضافات خارجية.



التثبيت

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                    

توصيات