حقق أداءً أعلى لتقارير البيانات الضخمة باستخدام نظام (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 أو إشعار.

الأسلوب ده هيخلي تطبيقك أسرع، أكثر استقرارًا، وأسهل للمستخدم.

المدونة

إزاي OAuth بيشتغل

يونيو 29, 2025

إزاي OAuth بيشتغل؟ OAuth هو بروتوكول بيخلّي التطبيقات تقدر تدخل على بياناتك بطريقة آمنة من غير ما تدّيهم الباسورد بتاعك. زي مثلًا لو حبيت تطبيق ينشر...

تجاوز $fillable بأمان باستخدام forceFill() في Laravel

يوليو 02, 2025

تجاوز $fillable بأمان باستخدام forceFill() في Laravel جربت تستخدم create() في Laravel ولاقيت إن حقول زي role أو status مش بتتحفظ؟ ده بسبب حماية Larav...

تذكير بالمهام مع Laravel وMongoDB

يونيو 30, 2025

📌 بناء تطبيق تذكير مهام المقال ده بيشرح إزاي نعمل تطبيق Laravel يستخدم MongoDB علشان يذكرك بالمهمات بتاعتك، مع تسجيل دخول، CRUD، وتذكير بالإيميلات...

React Native 0.80 وExecuTorch: بداية قوية للذكاء الاصطناعي المحلي في تطبيقات الموبايل

يوليو 28, 2025

🚀 الجديد في React Native 0.80 بالتفصيل الإصدار React Native 0.80 يعتبر نقطة تحول حقيقية في عالم تطوير تطبيقات الموبايل باستخدام React Native. التح...

الدليل الكامل لتحديثات ECMAScript 2025 للمطورين

يوليو 06, 2025

📘 شرح تفصيلي لتحديثات ECMAScript 2025 جميع مميزات ECMAScript 2025، مع أمثلة عملية وفهم ليه الميزة دي مهمة لأي مبرمج واجهة أمامية. ١. مجموعات مسما...

React Native 0.81: نقلة نوعية في كفاءة بيئة التطوير

يناير 27, 2026

مقدمة يُعد React Native من أكثر الأطر استخدامًا في تطوير تطبيقات الهواتف الذكية متعددة المنصات. ومع ذلك، ظل وقت بناء تطبيقات iOS أحد أكبر التحديا...