العمل مع قوائم المهام في PHP: دليل عملي شامل
\n\nفي تطبيقات الويب الحديثة، غالبًا ما تنشأ الحاجة لتنفيذ عمليات طويلة أو كثيفة الاستخدام للموارد دون إجبار المستخدم على الانتظار. إرسال النشرات البريدية، إنشاء تقارير PDF، معالجة الصور، تحليل البيانات - كل هذه المهام مثالية للمعالجة غير المتزامنة عبر قوائم المهام. في هذه المقالة، سنشرح بالتفصيل كيفية تنظيم العمل مع قوائم المهام في PHP عمليًا، وسنستعرض الأدوات الشائعة ونكتب كودًا عمليًا.
\n\nما هي قائمة المهام ولماذا نحتاجها؟
\n\nقائمة المهام (job queue) هي آلية تتيح وضع المهام في قائمة وتنفيذها بشكل غير متزامن، خارج التدفق الرئيسي لمعالجة طلب HTTP. بدلاً من تنفيذ عملية ثقيلة بشكل متزامن (مثل إرسال 1000 بريد إلكتروني عند التسجيل)، تقوم ببساطة بوضع المهمة في القائمة وإرجاع الرد للمستخدم فورًا. يقوم العامل الخلفي (worker) بسحب المهام من القائمة وتنفيذها واحدة تلو الأخرى.
\n\nالمزايا الرئيسية لاستخدام قوائم المهام:
\n- \n
- زيادة الأداء - لا ينتظر المستخدم اكتمال العمليات الثقيلة \n
- مقاومة الأعطال - إذا لم يتم تنفيذ المهمة، تعود إلى القائمة لإعادة المعالجة \n
- قابلية التوسع - يمكن تشغيل أي عدد من العمال للمعالجة المتوازية \n
- تخزين مؤقت للحمل - تعمل القائمة على تخفيف الأحمال الذروة على النظام \n
الأدوات الشائعة للعمل مع قوائم المهام في PHP
\n\n1. RabbitMQ
\nRabbitMQ هو وسيط رسائل قوي يدعم بروتوكول AMQP. وهو مثالي للسيناريوهات المعقدة لتوجيه الرسائل ويتطلب تثبيت خادم منفصل.
\n\n// التثبيت عبر Composer
composer require php-amqplib/php-amqplib
// إرسال مهمة إلى القائمة
<?php
require_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([
'to' => 'user@example.com',
'subject' => 'مرحبًا!',
'body' => 'رسالة اختبار'
]);
$msg = new AMQPMessage($data, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);
$channel->basic_publish($msg, '', 'email_queue');
$channel->close();
$connection->close();
?>\n\n2. Redis + php-resque
\nRedis هو مخزن سريع في الذاكرة (in-memory) مثالي لقوائم المهام البسيطة. php-resque هو نسخة PHP من مكتبة Resque الشهيرة في Ruby.
\n\n// التثبيت
composer require chrisboulton/php-resque
// إنشاء مهمة
<?php
class SendEmailJob
{
public function perform()
{
$args = $this->args;
// منطق إرسال البريد الإلكتروني
mail($args['to'], $args['subject'], $args['body']);
}
}
// الإضافة إلى القائمة
Resque::setBackend('localhost:6379');
Resque::enqueue('default', 'SendEmailJob', [
'to' => 'user@example.com',
'subject' => 'مرحبًا',
'body' => 'اختبار'
]);
?>\n\n3. Beanstalkd
\nBeanstalkd هو مدير قوائم خفيف وسريع وموثوق. سهل التثبيت والتكوين، مما يجعله خيارًا ممتازًا للمشاريع الصغيرة.
\n\n// التثبيت
composer require pda/pheanstalk
// إرسال مهمة
<?php
require_once 'vendor/autoload.php';
use Pheanstalk\\Pheanstalk;
$pheanstalk = Pheanstalk::create('127.0.0.1:11300');
$pheanstalk->useTube('email_tube')->put(
json_encode(['to' => 'user@example.com', 'subject' => 'Test']),
Pheanstalk::DEFAULT_PRIORITY,
Pheanstalk::DEFAULT_DELAY,
60 // TTR (time to run)