تخطَّ إلى المحتوى

🔺 شرح Laravel

الطوابير والمهام في الخلفية (Queues)

الدرس 25 من 28· ⏱ 2 دقائق قراءة· 🗓 آخر تحديث: ٢١ يوليو ٢٠٢٦

لماذا الطوابير؟

بعض المهام بطيئة: إرسال بريد، معالجة صورة، استدعاء API خارجي. لو نفّذتها داخل الطلب العادي ينتظر المستخدم ثوانٍ لا داعي لها. الطابور (Queue) يؤجّل تنفيذها لعملية خلفية منفصلة، فيرجع الردّ للمستخدم فورًا.

إنشاء مهمة (Job)

php artisan make:job SendWelcomeEmail
<?php
namespace App\Jobs;

use App\Models\User;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;

class SendWelcomeEmail implements ShouldQueue
{
    use Queueable;

    public function __construct(public User $user) {}

    public function handle(): void
    {
        Mail::to($this->user->email)->send(new WelcomeMail($this->user));
    }
}

تنفيذ ShouldQueue هو ما يجعل Laravel يرسل المهمة لطابور بدل تنفيذها فورًا.

إرسال المهمة (Dispatch)

<?php
SendWelcomeEmail::dispatch($user);

// تنفيذ فوري متزامن (مفيد للاختبار المحلي)
SendWelcomeEmail::dispatchSync($user);

// إرسال بشرط
SendWelcomeEmail::dispatchIf($user->wantsEmail, $user);

موصل الطابور (Connection)

يُضبَط في .env وconfig/queue.php:

QUEUE_CONNECTION=database
الموصلالاستخدام
syncتنفيذ فوري بلا طابور حقيقي — افتراضي التطوير
databaseيخزّن المهام بجدول قاعدة بيانات
redisأسرع وأشيع بالإنتاج

موصل database يحتاج جدولًا أولًا:

php artisan queue:table
php artisan migrate

تشغيل العامل (Worker)

php artisan queue:work

يبقى قيد التشغيل ويلتقط المهام تباعًا. بترتيب أولوية بين عدّة طوابير:

php artisan queue:work --queue=emails,default

💡 بالإنتاج شغّل queue:work عبر مدير عمليات مثل Supervisor ليعيد تشغيله تلقائيًا عند توقّفه أو عند نشر كود جديد.

تأخير وتوجيه المهمة

<?php
SendWelcomeEmail::dispatch($user)
    ->delay(now()->addMinutes(10))
    ->onQueue('emails')
    ->onConnection('redis');

فشل المهام وإعادة المحاولة

<?php
class SendWelcomeEmail implements ShouldQueue
{
    public $tries = 3;      // أقصى عدد محاولات
    public $timeout = 30;   // ثوانٍ قبل إيقافها قسرًا
}

المهام التي تفشل بكل محاولاتها تُحفظ بجدول failed_jobs:

php artisan queue:retry all

أخطاء شائعة

  • نسيان تشغيل queue:work فتبقى المهام متكدّسة بالطابور بلا تنفيذ أبدًا.
  • استخدام موصل sync بالإنتاج — ينفّذ المهام فورًا وكأنها بلا طابور أصلًا.

🎯 التالي: جدولة المهام.

شرح الطوابير والمهام في الخلفية (Queues) — Laravel بالعربي
الطوابير والمهام في الخلفية (Queues)Laravel بالعربي · The Code Fix

📚 لمزيد من التعمّق في Laravel، راجِع التوثيق الرسمي لـ Laravel.

هل كان هذا الدرس مفيدًا؟