JavaScript is not enabled!...Please enable javascript in your browser

جافا سكريبت غير ممكن! ... الرجاء تفعيل الجافا سكريبت في متصفحك.

Accueil

كيف اكتشفت أن أوامر Laravel Scheduler لا تعمل بعد رفع المشروع – وطرق الحل العملي


✍️ المقدمة:

أحد أصعب المشاكل التي قد تواجهك كمطور Laravel هي تلك التي لا يظهر لها أي خطأ... مثل عندما تضبط أوامر مجدولة (scheduler) لأداء مهام تلقائية، لكنها لا تعمل، ولا يظهر شيء في الـ logs!

واجهت هذا السيناريو فعليًا عند رفع مشروع إلى بيئة الإنتاج، وكان يجب إرسال بريد تلقائي للمستخدمين كل يوم صباحًا.
ولكن البريد لم يُرسل، رغم أن الأمر php artisan schedule:run يعمل محليًا بدون مشاكل.

في هذا المقال، سأشرح كيف اكتشفت السبب، وكيف أصلحت المشكلة بأسلوب عملي قابل للتطبيق في كل المشاريع.

🚦 المشكلة باختصار:

  • حددت أمر مجدول في App\Console\Kernel.php

  • جرّبته محليًا: ✅ شغال 100%

  • رفعت المشروع على السيرفر: ❌ المهام لا تعمل تلقائيًا

  • لا توجد أي رسائل خطأ أو إشعارات، فقط “لا شيء يحدث”!

🧠 أول خطوة: فهم كيف يعمل Laravel Scheduler فعليًا

المهام المجدولة في Laravel لا تعمل من تلقاء نفسها. يجب عليك تشغيل الأمر التالي كل دقيقة عبر cron:

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

وهذا معناه:

  • الكرون (cron) يطلق Laravel

  • Laravel يتحقق: هل هناك مهمة يجب تنفيذها الآن؟

  • إذا كان هناك، ينفذها.

🔍 اكتشاف المشكلة في مشروعي

عند فحص السيرفر، وجدت التالي:

  • ملف الكرون غير مفعل أصلًا

  • لم أقم بتسجيل الأمر في crontab

  • Laravel لا يمكنه تحديد التوقيت بسبب إعداد خاطئ في المنطقة الزمنية

🛠️ خطوات الحل العملي:

✅ 1. التأكد من تعريف المهام داخل Kernel.php

protected function schedule(Schedule $schedule)
{
    $schedule->command('emails:daily-reminder')->dailyAt('08:00');
}

✅ كل شيء كان معرف بشكل سليم.

✅ 2. تفعيل الكرون في السيرفر (Linux)

نفذت الأمر التالي:

crontab -e

ثم أضفت السطر التالي:

* * * * * cd /home/myproject && php artisan schedule:run >> /dev/null 2>&1

🔹 تأكدت من أن المسار صحيح وموجه إلى مشروع Laravel.

✅ 3. اختبار الأمر يدويًا

php artisan schedule:run

ظهرت رسالة تؤكد تنفيذ الأوامر، مما يعني أن Laravel نفسه يعمل، والمشكلة كانت فقط في cron.

✅ 4. التأكد من المنطقة الزمنية

في ملف .env:

APP_TIMEZONE=Asia/Riyadh

وفي config/app.php:

'timezone' => env('APP_TIMEZONE', 'UTC'),

🔹 قبل تعديل ذلك، Laravel كان يعتقد أن الساعة 8 صباحًا لم تأتِ بعد!

✅ 5. تسجيل Logs للمراجعة

أضفت log مخصص داخل الكوماند:

\Log::info('Daily email was sent!');

وبهذا أصبحت أتابع تنفيذ الأوامر من داخل storage/logs/laravel.log.

🎉 النتيجة:

تم حل المشكلة تمامًا، وعاد إرسال البريد التلقائي للعمل بانتظام يوميًا في الساعة 8 صباحًا.

🧾 خلاصة الدرس:

(الخطوة) (السبب) (الحل)
(لم يتم تنفيذ المهام) (cron غير مفعل) (أضف crontab)
(توقيت غير دقيق) (Laravel يعمل بتوقيت UTC) (حدد APP_TIMEZONE)
(لا توجد نتائج) (لا يوجد logging) (استخدم Log::info())
(يعمل محليًا فقط) (الكرون مفقود في السيرفر) (كرره في بيئة الإنتاج)

💬 نصيحة شخصية:

كلما استخدمت Laravel Scheduler، تأكد مما يلي:

  • استخدم crontab -e لتشغيله كل دقيقة

  • اختبر يدويًا بـ schedule:run

  • راقب السجلات (laravel.log)

  • تأكد من أن المهمة تعمل فعليًا، وليس فقط أنها مجدولة

✅ الخلاصة:

خطأ مثل “الجدولة لا تعمل” قد يبدو بسيطًا، لكنه يعطل خدمات مهمة جدًا.
ولأن Laravel لا يظهر رسالة خطأ واضحة عند فشل المهام المجدولة، عليك دائمًا التأكد من بيئة التشغيل (cron، الوقت، المسار، الأوامر).

NomE-mailMessage