المفهوم الأساسي
بدلاً من معالجة جميع الطلبات فورًا (مما قد يسبب انهيار النظام)، نستخدم نظام Queue في Laravel لمعالجة الطلبات بشكل تسلسلي في الخلفية.
كيف يعمل النظام في Laravel؟
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، يمكن إعادة المحاولة تلقائياً