قوائم المهام لـ 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