ما هي قوائم المهام في PHP ولماذا نحتاجها؟
في تطوير الويب الحديث، غالبًا ما تنشأ الحاجة لتنفيذ عمليات تستهلك موارد كثيرة أو تستغرق وقتًا طويلاً، والتي لا ينبغي أن تعيق عمل المستخدم. إرسال النشرات البريدية، إنشاء تقارير PDF، معالجة الصور، المزامنة مع واجهات برمجة التطبيقات الخارجية (API) — كل هذه المهام من الأفضل تنفيذها بشكل غير متزامن، في الخلفية. ولهذا الغرض تحديدًا توجد قوائم المهام (job queues) في PHP.
قائمة المهام هي آلية تسمح بوضع المهام (jobs) في مخزن خاص ومعالجتها بشكل تسلسلي أو متوازي باستخدام العمال (workers). يحصل المستخدم على رد فوري، بينما يتم العمل الثقيل لاحقًا، دون إبطاء تطبيق العمل.
المزايا الرئيسية لاستخدام قوائم المهام
- زيادة الأداء — لا ينتظر المستخدم اكتمال العمليات الثقيلة
- قابلية التوسع — يمكن تشغيل عدة عمال للمعالجة المتوازية
- الموثوقية — إذا لم يتم تنفيذ المهمة، فإنها تعود تلقائيًا إلى القائمة
- الجدولة — يمكن تأخير تنفيذ المهمة إلى وقت محدد
الأدوات الشائعة للعمل مع قوائم المهام في PHP
توجد عدة حلول شائعة لتنفيذ قوائم المهام في PHP. دعنا نستعرض أهمها:
1. RabbitMQ
وسيط رسائل قوي يدعم بروتوكولات متعددة. بالنسبة لـ PHP، تُستخدم مكتبة php-amqplib. يعتبر RabbitMQ مثاليًا للسيناريوهات المعقدة لتوجيه الرسائل.
2. Redis + PHP-Resque
حل خفيف الوزن يعتمد على Redis. PHP-Resque هو نسخة من مكتبة Resque الشهيرة في Ruby. مناسب تمامًا للمشاريع الصغيرة والمتوسطة.
3. Beanstalkd
مدير قوائم بسيط وسريع، مصمم خصيصًا لتطبيقات الويب. يعمل ببروتوكول Memcached. مكتبة pda/pheanstalk هي المعيار للعمل مع Beanstalkd في PHP.
4. Laravel Queues
إذا كنت تستخدم Laravel، فإن نظام قوائم المهام المدمج هو الخيار الأفضل. يدعم مشغلات لـ Redis و Beanstalkd و Amazon SQS وحتى قواعد البيانات.
مثال عملي: إنشاء قائمة مهام بسيطة في PHP
لنقم بإنشاء قائمة مهام بسيطة باستخدام Beanstalkd ومكتبة Pheanstalk. هذا خيار ممتاز للمبتدئين، حيث أن Beanstalkd سهل جدًا في الإعداد.
التثبيت والإعداد
أولاً، قم بتثبيت Beanstalkd على الخادم:
# Ubuntu/Debiansudo apt-get install beanstalkd
# macOSbrew install beanstalkd
# تشغيل الخادمbeanstalkd -l 127.0.0.1 -p 11300 &ثم قم بتثبيت مكتبة Pheanstalk عبر Composer:
composer require pda/pheanstalkإنشاء مهمة (Job)
لننشئ فئة لإرسال البريد الإلكتروني:
<?phpnamespace App\\Jobs;
class SendEmailJob{ private string $to; private string $subject; private string $body;
public function __construct(string $to, string $subject, string $body) { $this->to = $to; $this->subject = $subject; $this->body = $body; }
public function handle(): void { // هنا المنطق الفعلي لإرسال البريد الإلكتروني mail($this->to, $this->subject, $this->body); echo "تم إرسال البريد الإلكتروني إلى {$this->to}"; }
public function toArray(): array { return [ 'to' => $this->to, 'subject' => $this->subject, 'body' => $this->body, ]; }
public static function fromArray(array $data): self { return new self($data['to'], $data['subject'], $data['body']); }}إضافة المهمة إلى القائمة
الآن لنكتب السكريبت الذي يضع المهمة في القائمة: