I'm always excited to take on new projects and collaborate with innovative minds.

Phone

+20 115 052 9992

Website

https://ibrahimahmed.online/

Social Links

إزاي تعمل Task Scheduling باحترافية في Laravel

يا هلا بيك يا باشمهندس في عالم البرمجة! لو انت شغال على مشروع ويب بلغة PHP وإطار العمل العظيم لاراكيفل (Laravel)، فغالباً جالك يوم العميل طلب منك: "بص يا هندسة،

إزاي تعمل Task Scheduling باحترافية في Laravel
Reading Count: 4

يا هلا بيك يا باشمهندس في عالم البرمجة! لو انت شغال على مشروع ويب بلغة PHP وإطار العمل العظيم لاراكيفل (Laravel)، فغالباً جالك يوم العميل طلب منك: "بص يا هندسة، عايز كل يوم بالليل الساعة 12 السيستم يبعت إيميلات للعملاء"، أو "عزنا نعمل نسخة احتياطية (Backup) لقاعدة البيانات أوتوماتيك كل أسبوع". هنا بقى بيظهر "الوجع" القديم.. كنا زمان بندخل على الـ Server ونعمل إعدادات الـ Cron Jobs المعقدة لكل مهمة، وكل شوية ملف السيرفر يبوظ والدنيا تتلخبط.

لكن إطمن، لاراڤيل وفرت علينا وجع الدماغ ده كله بـ ميزة سحرية اسمها جدولة المهام (Task Scheduling). في المقال ده، هنتكلم بالتفصيل عن إزاي تعمل Task Scheduling باحترافية في لاراڤيل، وتشغل مهام زي النسخ الاحتياطي وإرسال الإيميلات الدورية من مكان واحد وبأوامر بسيطة جداً.

إيه هو الـ Task Scheduling وليه محتاجين نستخدمه؟

زمان، عشان تخلي السيرفر ينفذ أمر في وقت معين، كنت بتضطر تعمل Cron Job لكل مهمة على حِدة في نظام التشغيل (زي لينكس). ده كان بيخليك كل ما تحب تغير ميعاد مهمة، تضطر تدخل على السيرفر بـ SSH وتعدل ملف الـ crontab يدوياً.

مع نظام الجدولة في لاراڤيل (Laravel Scheduler)، الموضوع اختلف تماماً. كل اللي محتاجه هو Cron Job واحدة بس على السيرفر كله، وباقي المهام بتديرها جوه كود لاراڤيل نفسه في ملف app/Console/Kernel.php (أو ملف التوجيهات الجديد في الإصدارات الحديثة). ده بيخلي الكود بتاعك منظم، وكمان تقدر تعمل نسخه وتنقله بين السيرفرات من غير ما تشيل هم إعدادات السيرفر الداخلية.

الخطوة الأولى: إعداد الـ Cron Job على السيرفر (مرة واحدة وللعمر)

عشان نظام الجدولة في لاراڤيل يشتغل، لازم تقول للسيرفر: "لو سمحت، كل دقيقة شغل الأمر الأساسي بتاع لاراڤيل". ده بيتم عن طريق إضافة Cron Job واحدة حقيقية على السيرفر.

بتفتح الـ Terminal وتكتب الأمر ده:

crontab -e

وتضيف السطر ده في الآخر (مع مراعاة تغيير مسار المشروع لمسارك الحقيقي):

* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

بالشكل ده، السيرفر كل دقيقة هينفذ أمر schedule:run، ولاراڤيل بقى هو اللي هياخد الزمام ويكشف هل فيه أي مهمة (Task) جه ميعادها النهارده ولا لأ.

الخطوة الثانية: كتابة مهام إرسال الإيميلات الدورية (Email Notifications)

تخيل إننا عايزين نبعت تقرير أسبوعي للعملاء. أول حاجة بنعملها هي إنشاء أمر (Artisan Command) جديد:

php artisan make:command SendWeeklyReports

بعدين بندخل على الملف اللي اتنشئ في app/Console/Commands/SendWeeklyReports.php، ونكتب المنطق البرمجي الخاص بإرسال الإيميلات جوه دالة الـ handle:


public function handle()
{
    // هات كل العملاء وابعتليهم الإيميل
    $users = User::all();
    foreach ($users as $user) {
        // Mail::to($user->email)->send(new WeeklyReportMail());
    }
    
    $this->info('Weekly reports sent successfully!');
}

دلوقتي، جه ميعاد ربط الأمر ده بـ جدول المواعيد (Scheduler). هنروح لملف الجدولة ونضيف الأمر ده جوه دالة الـ schedule:


protected function schedule(Schedule $schedule)
{
    $schedule->command('reports:weekly')->weeklyOn(1, '8:00'); // كل إثنين الساعة 8 الصبح
}

الخطوة الثالثة: جدولة النسخ الاحتياطي لقاعدة البيانات (Database Backups)

حماية الداتا دي أمانة كبيرة في رقبة كل مبرمج. عشان نعمل نسخة احتياطي لقاعدة البيانات (Database Backup) أوتوماتيك كل يوم بالليل، ممكن نكتب كود جوه ملف الجدولة مباشرة من غير حتى ما نعمل Artisan Command منفصل، أو نستخدم باكدج مشهورة زي Spatie Backup.

مثال لكود جدولة مهمة باستخدام closure عادية:


protected function schedule(Schedule $schedule)
{
    $schedule->call(function () {
        // كود الـ Backup هنا أو استدعاء خدمة الـ Backup
        Log::info('Database backup running...');
    })->dailyAt('02:00'); // بيشتغل كل يوم الساعة 2 بالليل
}

أهم تكات وطرق الاحتراف في الـ Laravel Scheduler

عشان تضمن إن شغلك احترافي وما يقابلش مشاكل على الإنتاج (Production Environment)، خد بالك من النقط دي:

  • منع التداخل (Without Overlapping): لو المهمة خدت وقت أطول من المعاد المحدد ليها (مثلاً بتاخد 10 دقايق والجدولة كل دقيقة)، ممكن يحصل تداخل والسيستم يضرب. حلها بكلمة ->withoutOverlapping().
  • منع التشغيل المتكرر في السيرفرات المتعددة (Server Load Balancing): لو شغال على أكتر من سيرفر (Multiple Servers)، استخدم ->onOneServer() عشان المهمة تتفذ مرة واحدة بس على مستوى السيستم كله.
  • تسجيل الأخطاء (Log Files): استخدم ->sendOutputTo($filePath) عشان تسجل أي أخطاء تحصل أثناء تنفيذ المهمة وتعرف تراجعها بعد كده.

خاتمة ونصيحة من أخ

يا بشمهندس، الـ Task Scheduling في لاراڤيل مش مجرد ميزة فرعية، دي عصب أساسي لأي تطبيق ويب احترافي بيعتمد على الأتمتة (Automation). نصيحتي ليك: متكتفش نفسك بكتابة كود الجدولة وخلاص، دايمًا جرب المهام دي محلياً باستخدام الأمر php artisan schedule:work وتأكد إن كل حاجة شغالة تمام قبل ما ترفع مشروعك للـ Production. بالتوفيق، ومستنيك في مقالات تقنية جاية!


Share

Related posts

Aug 14, 2026 • 1 min read
Reading Count: 4
أسرار الـ Custom Validation Rules في لارايفل (Laravel) لتنظيف الكود

التصنيف: Web Development, Tutorials أسرار الـ Custom Validation Rules في لارايفل (Laravel) لتنظيف ال...

Aug 13, 2026 • 1 min read
Reading Count: 7
مقارنة حاسمة: Livewire أم Inertia.js؟ أيهما تختار لمشروعك القادم

يا هلا بيك يا صديقي المبرمج! لو انت شغّال بتطوير مواقع الويب (Web Development) بلارافيل (Laravel)، ف...

Aug 13, 2026 • 1 min read
Reading Count: 3
دليل بناء لوحات التحكم في ساعات باستخدام Filament PHP

يا هلا بيك يا صديقي المبرمج في عالم تطوير الويب (Web Development). تعال نتكلم كلمتين على بلاطة؛ كم م...