مقدمة في قوائم المهام في PHP
\n\nفي تطوير الويب الحديث، غالبًا ما تنشأ مواقف تتطلب تنفيذ عمليات طويلة أو كثيفة الاستخدام للموارد دون إجبار المستخدم على الانتظار. على سبيل المثال: إرسال البريد الإلكتروني الجماعي، إنشاء تقارير PDF، معالجة الصور أو التكامل مع واجهات برمجة التطبيقات الخارجية. وهنا تأتي قوائم المهام (job queues) لإنقاذ الموقف - وهي إحدى الأدوات الرئيسية لمطور الواجهة الخلفية.
\n\nقائمة المهام هي آلية تسمح بتأجيل تنفيذ عملية كثيفة الاستخدام للموارد في الخلفية، مما يحرر التدفق الرئيسي للتطبيق لمعالجة الطلبات الجديدة. في هذه المقالة، سنشرح بالتفصيل كيفية العمل مع قوائم المهام في PHP، بدءًا من المفاهيم الأساسية وصولاً إلى الأمثلة العملية.
\n\nما هي قائمة المهام ولماذا نحتاجها؟
\n\nتخيل أن موقعك يحتاج إلى إرسال 1000 رسالة بريد إلكتروني بعد تسجيل المستخدم. إذا تم تنفيذ ذلك بشكل متزامن، فسيتم تحميل الصفحة لعدة دقائق. سيغادر المستخدم، وسيتم حظر الخادم. تحل قائمة المهام هذه المشكلة: يتم وضع مهمة إرسال الرسائل في قائمة الانتظار ومعالجتها بواسطة عامل خلفية، ويتلقى المستخدم الرد على الفور.
\n\nالمزايا الرئيسية لاستخدام قوائم المهام
\n- \n
- تحسين تجربة المستخدم - لا ينتظر المستخدم اكتمال العمليات الطويلة \n
- زيادة الأداء - يعالج الخادم الطلبات بشكل أسرع \n
- قابلية التوسع - يمكن إضافة عمال إضافيين لمعالجة قائمة الانتظار \n
- تحمل الأخطاء - في حالة الفشل، يمكن إعادة وضع المهام في قائمة الانتظار \n
- الجدولة - تنفيذ المهام في وقت محدد \n
هندسة قوائم المهام في PHP
\n\nيتكون نظام قوائم المهام النموذجي من ثلاثة مكونات:
\n- \n
- المنتج (Producer) - جزء الكود الذي يضيف المهام إلى قائمة الانتظار \n
- قائمة الانتظار (Queue) - مخزن المهام (غالبًا ما يعتمد على Redis أو Beanstalkd أو قاعدة بيانات) \n
- العامل (Worker) - سكريبت يستمع باستمرار إلى قائمة الانتظار وينفذ المهام \n
في PHP، للعمل مع قوائم المهام، غالبًا ما تُستخدم المكتبات php-resque أو Laravel Queue (إذا كنت تعمل مع Laravel) أو enqueue/fs. سننظر في نهج عام يمكن تكييفه مع أي إطار عمل.
مثال عملي: إنشاء قائمة مهام في PHP خالص
\n\nلنقم بإنشاء نظام بسيط لقوائم المهام باستخدام Redis. قم بتثبيت Redis وامتداد phpredis أو استخدم predis/predis عبر Composer.
الخطوة 1: إعداد البيئة
\ncomposer require predis/predis\n\nالخطوة 2: إنشاء المنتج
\nسيقوم المنتج بإضافة المهام إلى قائمة الانتظار. لننشئ ملف producer.php:
<?php\nrequire 'vendor/autoload.php';\n\nuse Predis\\Client as RedisClient;\n\nclass JobProducer {\n private $redis;\n \n public function __construct() {\n $this->redis = new RedisClient([\n 'scheme' => 'tcp',\n 'host' => '127.0.0.1',\n 'port' => 6379,\n ]);\n }\n \n public function addJob(string $queueName, array $jobData): void {\n $job = json_encode([\n 'id' => uniqid(),\n 'data' => $jobData,\n 'created_at' => time()\n ]);\n \n // نستخدم RPUSH للإضافة إلى نهاية قائمة الانتظار\n $this->redis->rpush("queue:{$queueName}", $job);\n echo "تمت إضافة المهمة إلى قائمة الانتظار {$queueName}\\n";\n }\n}\n\n// مثال على الاستخدام\n$producer = new JobProducer();\n$producer->addJob('emails', [\n 'to' => 'user@example.com',\n 'subject' => 'مرحبًا بك!',\n 'body' => 'شكرًا لتسجيلك...'\n]);\n?>\n\nالخطوة 3: إنشاء العامل
\nالعامل