حقق أداءً أعلى لتقارير البيانات الضخمة باستخدام نظام (Queues)
يوليو 7, 2025- إزاي نعمل كاش لتقارير بفترة زمنية ثابتة
- إزاي نولّد تقارير ضخمة في الخلفية باستخدام الـ Job Queues
1. 🧠 كاش للتقارير بفترة زمنية ثابتة
لو عندك تقرير بيعرض آخر 30 يوم من المبيعات، تشغيل الاستعلام في كل مرة مستخدم يفتح الصفحة يعتبر تحميل زائد على السيرفر. الحل إننا نخزّن البيانات مؤقتًا (كاش) لحد نهاية اليوم.
ليه نستخدم فترة زمنية ثابتة؟
- كل المستخدمين يشوفوا نفس نسخة البيانات.
- انتهاء الكاش بيكون معروف (زي الساعة 12 بالليل).
مثال عملي باستخدام Laravel:
use Illuminate\Support\Facades\Cache;
public function getReport()
{
$cacheKey = 'sales_report_daily';
$expiresAt = now()->endOfDay();
return Cache::remember($cacheKey, $expiresAt, function () {
return DB::table('sales')
->whereDate('created_at', '>=', now()->subDays(30))
->get();
});
}
الكاش بيخزن البيانات لحد 11:59 مساءً، وبعد كده أول طلب جديد هيحدث البيانات تلقائي. لو عايز فترات تانية ممكن تستخدم endOfWeek()
أو endOfMonth()
.
2. 📦 توليد تقارير ضخمة باستخدام Job Queues
لو التقرير فيه ملايين الصفوف، مش منطقي توليده مباشرة جوه الريكوست العادي لإن ده ممكن يبطأ الصفحة أو يسبب توقف. الأفضل إنك تبعته يتولّد في الخلفية وتخلي الواجهة تستنى لحد ما الملف يبقى جاهز.
الخطوة 1: إرسال المهمة (Dispatch Job)
public function requestReport()
{
GenerateBigReport::dispatch(auth()->id());
return response()->json([
'message' => 'بدأنا في تجهيز التقرير. هنبعتلك إشعار لما يكون جاهز.'
]);
}
الخطوة 2: إنشاء الـ Job نفسه
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Storage;
class GenerateBigReport implements ShouldQueue
{
use Queueable;
public $userId;
public function __construct($userId)
{
$this->userId = $userId;
}
public function handle()
{
$data = DB::table('transactions')->get();
$path = storage_path("app/reports/report_{$this->userId}.csv");
$csv = fopen($path, 'w');
fputcsv($csv, ['id', 'amount', 'date']);
foreach ($data as $row) {
fputcsv($csv, [$row->id, $row->amount, $row->created_at]);
}
fclose($csv);
// ممكن هنا تبعت إشعار للمستخدم إن التقرير جاهز
}
}
الخطوة 3: التأكد من إن التقرير جاهز
public function checkReport()
{
$path = "reports/report_" . auth()->id() . ".csv";
if (Storage::exists($path)) {
return response()->json([
'ready' => true,
'download_url' => Storage::url($path)
]);
}
return response()->json(['ready' => false]);
}
وفي الواجهة الأمامية (Frontend):
async function checkReport() {
const res = await fetch('/api/check-report');
const json = await res.json();
if (json.ready) {
showDownloadButton(json.download_url);
} else {
showProcessingState();
}
}
بكده المستخدم مش مضطر يستنى تنفيذ تقرير تقيل في نفس اللحظة، والسيرفر يفضل مستقر، والتجربة تفضل سلسة.
✨ الخلاصة
- استخدم الكاش بفترات زمنية محددة علشان تقلل الضغط وتبقي البيانات متاحة.
- لما يكون عندك تقارير ضخمة، شغلها في الخلفية باستخدام Job Queues.
- خلّي الواجهة الأمامية تتفاعل بسلاسة مع حالة التقرير باستخدام polling أو إشعار.
الأسلوب ده هيخلي تطبيقك أسرع، أكثر استقرارًا، وأسهل للمستخدم.
المدونة
إتقان التحقق الشرطي في Laravel 12
يوليو 07, 2025
إتقان التحقق الشرطي في Laravel 12 في Laravel 12، نظام التحقق (validation) قوي جدًا، وميزة التحقق الشرطي بتخليك تتحكم في القوانين بتاعتك ب...
هل لارافيل بطيء؟ تحسين أداء الاستعلامات والفهارس بأمثلة
يوليو 20, 2025
دليل عملي ومفصل مع أمثلة واقعية وعينات كود تسهّل عليك تفادي بطء Laravel وتحافظ على سرعة التطبيق. 1. 🧠 استدعي اللي محتاجه بس لو بتعمل DB::tabl...
نظرة معمقة على Laravel Context: تسجيل وتحليل السياق البرمجي باحترافية
يوليو 20, 2025
في Laravel 12، تم تقديم Laravel Context كأداة قوية بتخلي تتبع الطلبات، تسجيل الأخطاء، وتحليل سلوك الوظائف الخلفية أسهل وأدق من أي وقت فات. وده بيحصل ع...
Laravel 12.19: استخدام Attributes لتنظيم الـ Query Builder
يوليو 07, 2025
Laravel 12.19: استخدام Attributes تنظّم Query Builder في Laravel 12.19، دلوقتي تقدر تستخدم Attribute اسمه #[UseEloquentBuilder] علشان تحدد Query Bu...
مقارنة بين Scopes + Traits × UseEloquentBuilder في Laravel
يوليو 13, 2025
في Laravel، بنحتاج دايمًا نكتب استعلامات شبه بعض في أكتر من مكان. Laravel بتوفر طريقتين أساسيين نقدر نستخدمهم علشان نرتّب الاستعلامات دي: Scopes + Tra...
البرمجة الكائنية (OOP) – المفاهيم الأساسية
أغسطس 09, 2025
البرمجة الكائنية التوجه (Object Oriented Programming - OOP) هي أسلوب حديث في تطوير البرمجيات يُقسّم التطبيق إلى وحدات تسمى كائنات (Objects) تتفاعل م...
