قوائم المهام لـ PHP: RabbitMQ و Gearman و Redis
في تطبيقات الويب الحديثة بلغة PHP، غالبًا ما تنشأ الحاجة لتنفيذ عمليات طويلة أو كثيفة الاستخدام للموارد دون حظر التدفق الرئيسي للمستخدم. إرسال النشرات البريدية، إنشاء التقارير، معالجة الصور، العمل مع الفيديو - كل هذه المهام من الأفضل تنفيذها بشكل غير متزامن، في الخلفية. لهذا الغرض، توجد قوائم المهام (job queues) - وهي آليات تسمح بتأجيل تنفيذ المهمة ومعالجتها لاحقًا باستخدام العمال (workers).
في هذه المقالة، سنستعرض ثلاث أدوات شائعة لتنظيم قوائم المهام في PHP: RabbitMQ و Gearman و Redis. ستتعرف على الحالات التي يجب استخدامها فيها، وسترى أمثلة على الكود.
لماذا نحتاج إلى قوائم المهام؟
المزايا الرئيسية لاستخدام قوائم الانتظار:
- عدم التزامن - لا ينتظر المستخدم اكتمال العملية الثقيلة.
- قابلية التوسع - يمكنك تشغيل العديد من العمال للمعالجة المتوازية.
- تحمل الأخطاء - إذا تعطل العامل، تبقى المهمة في قائمة الانتظار وستتم معالجتها لاحقًا.
- فصل المسؤوليات - كود إرسال المهمة وكود معالجتها مرتبطان بشكل ضعيف.
1. RabbitMQ - وسيط رسائل قوي
RabbitMQ هو وسيط رسائل متكامل يدعم بروتوكول AMQP. يضمن التوصيل المضمون، التوجيه، التأكيدات، وغيرها الكثير. مناسب للأنظمة المعقدة ذات الأحمال العالية.
للعمل مع RabbitMQ في PHP، يُستخدم الامتداد php-amqplib.
التثبيت
composer require php-amqplib/php-amqplibمثال: إرسال مهمة
<?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(['email' => 'user@example.com', 'subject' => 'مرحبًا!']);$msg = new AMQPMessage($data, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);
$channel->basic_publish($msg, '', 'email_queue');echo "تم إرسال المهمة إلى قائمة الانتظار";
$channel->close();$connection->close();مثال: العامل (المعالج)
<?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);
$callback = function ($msg) { $data = json_decode($msg->body, true); echo "جارٍ إرسال البريد إلى {$data['email']} بموضوع '{$data['subject']}'"; // هنا الإرسال الفعلي للبريد الإلكتروني $msg->ack(); // تأكيد المعالجة};
$channel->basic_qos(null, 1, null);$channel->basic_consume('email_queue', '', false, false, false, false, $callback);
while ($channel->is_consuming()) { $channel->wait();}2. Gearman - نظام توزيع المهام
Gearman متخصص في المعالجة الموزعة للمهام. يسمح باستدعاء الدوال على خوادم بعيدة أو في الخلفية. مناسب تمامًا للهندسة المعمارية القائمة على الخدمات المصغرة.
بالنسبة لـ PHP، يوجد امتداد gearman (PECL).
التثبيت
sudo apt install gearman-job-serverpecl install gearmanمثال: العميل (إرسال مهمة)
<?php$client = new GearmanClient();$client->addServer('127.0.0.1', 4730);
$result = $client->doBackground('send_email', json_encode([ 'email' => 'user@example.com', 'subject' => 'مرحبًا!']));
echo "تم إرسال المهمة