المفهوم الأساسي
بدلاً من معالجة جميع الطلبات فورًا (مما قد يسبب انهيار النظام)، نستخدم نظام Queue في Laravel لمعالجة الطلبات بشكل تسلسلي في الخلفية.
كيف يعمل النظام في Laravel؟
- استقبال فوري: المستخدم يرسل الطلب ويحصل على رد سريع
- الإضافة للـ Queue: يتم وضع الطلب في Queue للمعالجة اللاحقة
- المعالجة في الخلفية: Queue Workers تعالج الطلبات واحدًا تلو الآخر
- إشعار المستخدم: بعد إتمام المعالجة، يتم إرسال إشعار
Queue Drivers المتاحة في Laravel
Laravel يدعم عدة Queue Drivers، كل واحد له استخداماته:
1. Database Queue (للتطبيقات الصغيرة)
bash# إنشاء جداول Queue php artisan queue:table php artisan queue:failed-table php artisan migrate
env# في .env QUEUE_CONNECTION=database
php// إنشاء Job جديد
php artisan make:job ProcessOrder
// app/Jobs/ProcessOrder.php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class ProcessOrder implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public function __construct(
public Order $order
) {}
public function handle(): void
{
// معالجة الطلب
$this->order->process();
// إرسال إشعار
$this->order->user->notify(new OrderProcessed($this->order));
}
}php// في Controller
public function store(Request $request)
{
$order = Order::create($request->validated());
// إضافة للـ Queue
ProcessOrder::dispatch($order);
return response()->json([
'message' => 'تم استلام طلبك بنجاح وسيتم معالجته قريباً',
'order_id' => $order->id
], 202); // 202 Accepted
}bash# تشغيل Queue Worker php artisan queue:work
2. Redis Queue (للإنتاج - موصى به)
Redis هو الخيار الأفضل للإنتاج لأنه سريع وموثوق:
bash# تثبيت Redis composer require predis/predis
env# في .env QUEUE_CONNECTION=redis REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379
php// في config/queue.php
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => env('REDIS_QUEUE', 'default'),
'retry_after' => 90,
'block_for' => null,
'after_commit' => false,
],php// استخدام Queues مختلفة حسب الأولوية
ProcessOrder::dispatch($order)->onQueue('high');
SendWelcomeEmail::dispatch($user)->onQueue('emails');
GenerateReport::dispatch($data)->onQueue('low');bash# تشغيل Workers لـ queues مختلفة php artisan queue:work redis --queue=high,default,low,emails
3. Laravel Horizon (لإدارة Redis Queues)
Horizon يوفر لوحة تحكم جميلة لمراقبة الـ Queues:
bashcomposer require laravel/horizon php artisan horizon:install php artisan migrate
php// في config/horizon.php 'environments' => [ 'production' => [ 'supervisor-1' => [ 'connection' => 'redis', 'queue' => ['high', 'default'], 'balance' => 'auto', 'maxProcesses' => 10, 'maxTime' => 0, 'maxJobs' => 0, 'memory' => 128, 'tries' => 3, 'timeout' => 60, ], 'supervisor-2' => [ 'connection' => 'redis', 'queue' => ['emails', 'notifications'], 'balance' => 'auto', 'maxProcesses' => 5, 'tries' => 2, 'timeout' => 30, ], ], ],
bash# تشغيل Horizon php artisan horizon # الوصول للـ Dashboard # http://your-app.com/horizon
Job Chaining & Batching
Laravel يدعم سلاسل Jobs معقدة:
phpuse Illuminate\Support\Facades\Bus;
// سلسلة Jobs
Bus::chain([
new ProcessOrder($order),
new UpdateInventory($order),
new SendInvoice($order),
new NotifyUser($order),
])->dispatch();
// Batch Jobs مع معالجة النجاح والفشل
Bus::batch([
new ProcessPayment($order1),
new ProcessPayment($order2),
new ProcessPayment($order3),
])->then(function (Batch $batch) {
// جميع Jobs نجحت
})->catch(function (Batch $batch, Throwable $e) {
// أول job فشل
})->finally(function (Batch $batch) {
// انتهى الـ batch
})->dispatch();الفوائد الرئيسية
✅ تجربة مستخدم أفضل: استجابة فورية دون انتظار
✅ استقرار النظام: معالجة منظمة تمنع التحميل الزائد
✅ قابلية التوسع: يمكن إضافة Workers إضافيين بسهولة
✅ الموثوقية: في حالة فشل Job، يمكن إعادة المحاولة تلقائياً