قوائم المهام لـ PHP: RabbitMQ و Beanstalkd و Gearman
في تطبيقات الويب الحديثة، غالبًا ما تنشأ الحاجة لتنفيذ عمليات طويلة أو كثيفة الاستخدام للموارد بشكل غير متزامن، دون إجبار المستخدم على انتظار الرد. الأمثلة النموذجية: إرسال النشرات البريدية، إنشاء التقارير، معالجة الصور، التفاعل مع واجهات برمجة التطبيقات الخارجية. لحل هذه المهام في PHP، يتم استخدام قوائم المهام (job queues). فهي تسمح بفصل منطق الطلب عن المعالجة الخلفية، مما يعزز استجابة الواجهة وقابلية توسع النظام.
في هذه المقالة، سنستعرض بالتفصيل ثلاث أدوات شائعة لتنظيم قوائم المهام في PHP: RabbitMQ و Beanstalkd و Gearman. ستتعرف على ميزاتها، بنيتها، أمثلة استخدامها، وستتعلم كيفية اختيار الحل المناسب لمشروعك.
1. RabbitMQ
RabbitMQ هو وسيط رسائل قوي، يطبق بروتوكول AMQP (بروتوكول وضع الرسائل المتقدم). يدعم سيناريوهات التوجيه المعقدة، والمبادلات (exchanges)، وقوائم الانتظار ذات الأولويات، وتأكيدات التسليم، وغير ذلك الكثير. RabbitMQ مثالي للهندسة المعمارية القائمة على الخدمات المصغرة والأنظمة التي تتطلب تسليمًا موثوقًا للرسائل.
التثبيت والاتصال
للعمل مع RabbitMQ في PHP، يتم استخدام المكتبة php-amqplib. التثبيت عبر Composer:
composer require php-amqplib/php-amqplibمثال: إرسال إشعار بريد إلكتروني
سننشئ منتجًا (مرسلًا) ومستهلكًا (معالجًا) لإرسال الرسائل في الخلفية.
ملف producer.php:
<?phprequire_once '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' => 'مرحبًا بك!', 'body' => 'شكرًا لتسجيلك.']);
$msg = new AMQPMessage($data, [ 'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);
$channel->basic_publish($msg, '', 'email_queue');
echo " [x] تم إرسال الرسالة";
$channel->close();$connection->close();ملف consumer.php:
<?phprequire_once '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); // محاكاة إرسال البريد الإلكتروني sleep(2); echo " [x] تم إرسال البريد الإلكتروني إلى {$data['email']}"; $msg->ack();};
$channel->basic_qos(null, 1, null);$channel->basic_consume('email_queue', '', false, false, false, false, $callback);
while ($channel->is_consuming()) { $channel->wait();}
$channel->close();$connection->close();2. Beanstalkd
Beanstalkd هو مدير قوائم مهام خفيف الوزن وسريع وسهل الاستخدام. يعمل ببروتوكول مشابه لـ memcached، وهو مثالي للمهام التي لا تتطلب توجيهًا معقدًا. يدعم Beanstalkd الأولويات، والتأخير (delay)، ووقت التشغيل (TTR).
التثبيت
لـ PHP يوجد عميل pda/pheanstalk:
composer require pda/pheanstalkمثال: معالجة الصور
لنفترض أننا بحاجة لإنشاء صور مصغرة للصور المرفوعة.
ملف producer.php:
<?phprequire_once 'v