آموزش Laravel Scheduler، اجرای وظایف زمانبندیشده روی سرور
در بسیاری از پروژههای لاراول، لازم است برخی عملیات بهصورت خودکار و در زمان مشخص اجرا شوند. برای مثال، ارسال ایمیل یادآوری، پاکسازی اطلاعات قدیمی، بررسی وضعیت سفارشها، تهیه گزارشهای دورهای و اجرای دستورات نگهداری سرور، از جمله وظایفی هستند که نباید به اجرای دستی وابسته باشند. Laravel Scheduler ابزاری داخلی در لاراول است که مدیریت این وظایف را ساده میکند. به کمک این قابلیت میتوانید زمان اجرای دستورات و Jobها را در یک محل مشخص تعریف کرده و اجرای آنها را به سرور بسپارید.
در این مطلب، با نحوه کار Laravel Scheduler، تعریف وظایف زمانبندیشده، تنظیم Cron در سرور و روشهای بررسی خطا آشنا میشوید. هدف این است که بتوانید Scheduler را در یک پروژه واقعی راهاندازی نموده و بدون تعریف چندین Cron Job مجزا، وظایف خودکار برنامه را مدیریت کنید.
Laravel Scheduler چیست و چه کاربردی دارد؟
Laravel Scheduler یک سیستم زمانبندی داخلی در فریمورک لاراول است که امکان اجرای خودکار دستورات و عملیات مختلف را در بازههای زمانی مشخص فراهم میکند.
در روش سنتی، برای هر وظیفه باید یک Cron Job جداگانه روی سرور تعریف کنید. این روش با افزایش تعداد وظایف، مدیریت سرور را دشوار میکند.
Laravel Scheduler این مشکل را برطرف میکند. شما زمانبندی تمام وظایف را در کد پروژه تعریف میکنید و تنها به یک Cron Job برای فراخوانی Scheduler نیاز دارید.
برای مثال، میتوانید وظایف زیر را زمانبندی کنید:
- ارسال ایمیلهای یادآوری در ساعت مشخص
- حذف فایلها و اطلاعات موقت قدیمی
- بررسی سفارشهای پرداختنشده
- اجرای گزارشهای روزانه و هفتگی
- پاکسازی لاگها و دادههای منقضیشده
- اجرای دستورات اختصاصی Artisan
مزیت اصلی این روش، متمرکزشدن مدیریت وظایف و سادهترشدن تغییر برنامه زمانی آنها است.
Laravel Scheduler چگونه کار میکند؟
برای درک عملکرد Scheduler باید با مفهوم Cron آشنا باشید. Cron ابزاری در سیستمعاملهای لینوکسی است که دستورات را در زمانهای مشخص اجرا میکند.
لاراول از Cron برای فراخوانی Scheduler استفاده میکند. پس از فراخوانی، Scheduler وظایفی را که زمان اجرای آنها فرا رسیده است، شناسایی و اجرا میکند.
فرایند کلی به این شکل است:
- وظایف در فایلهای زمانبندی لاراول تعریف میشوند.
- یک Cron Job در سرور، دستور Scheduler را هر دقیقه اجرا میکند.
- لاراول وظایف آماده اجرا را بررسی میکند.
- عملیات زمانبندیشده مطابق تنظیمات اجرا میشوند.
نکته مهم این است که Cron فقط وظیفه فراخوانی Scheduler را بر عهده دارد. مدیریت زمانبندی و تشخیص وظایف آماده اجرا توسط خود لاراول انجام میشود.
تعریف وظایف زمانبندیشده در Laravel
محل تعریف وظایف زمانبندیشده به نسخه لاراول و ساختار پروژه بستگی دارد. در نسخههای جدید، معمولا از فایل routes/console.php استفاده میشود. در نسخههای قدیمیتر، این تنظیمات در فایل app/Console/Kernel.php و متد schedule قرار میگیرند.
تعریف زمانبندی در Laravel جدید
برای مثال، در فایل routes/console.php میتوانید یک دستور ساده را هر روز اجرا کنید:
در این مثال، دستور Artisan با نام inspire روزانه اجرا میشود.
اگر بخواهید یک عملیات را هر دقیقه اجرا کنید، کافی است از متد everyMinute استفاده کنید:
تعریف زمانبندی در نسخههای قدیمی لاراول
در نسخههایی که از ساختار Kernel استفاده میکنند، باید وظایف را در متد schedule تعریف کنید:
این ساختار امکان مدیریت تمام وظایف زمانبندیشده را در یک محل فراهم میکند.
روشهای زمانبندی در Laravel Scheduler
لاراول متدهای مختلفی برای تعیین زمان اجرای وظایف در اختیار شما قرار میدهد. انتخاب متد مناسب به نوع عملیات و فاصله زمانی موردنیاز بستگی دارد.
برای مثال، اگر قرار است یک گزارش روزانه تولید شود، نیازی به اجرای دستور در هر دقیقه نیست. استفاده از زمانبندی مناسب به کاهش بار سرور کمک میکند.
متدهای پرکاربرد زمانبندی
برخی از متدهای کاربردی Laravel Scheduler عبارتند از:
همچنین میتوانید زمان اجرای دقیق یک وظیفه را مشخص کنید:
در این مثال، دستور هر روز ساعت ۲ بامداد اجرا میشود.
برای اجرای یک وظیفه در روز و ساعت مشخص هم میتوانید از ترکیب متدهای زیر استفاده کنید:
این دستور هر دوشنبه ساعت ۸ صبح اجرا میشود.
اجرای مستقیم کد با استفاده از Schedule::call
همیشه لازم نیست برای هر وظیفه یک دستور Artisan ایجاد کنید. اگر عملیات سادهای دارید، میتوانید از Closure استفاده کنید:
این مثال اطلاعات موقت قدیمیتر از ۳۰ روز را بهصورت روزانه حذف میکند.
البته برای عملیات پیچیده، بهتر است منطق اصلی را داخل کلاس جداگانه یا Job قرار دهید تا مدیریت و تست کد سادهتر باشد.
اجرای Job با Laravel Scheduler
یکی از کاربردهای مهم Scheduler، اجرای Jobهای لاراول است. برای مثال، اگر قرار است ایمیلهای یادآوری به کاربران ارسال شوند، میتوانید یک Job ایجاد کنید و اجرای آن را به Scheduler بسپارید.
پس از پیادهسازی منطق ارسال ایمیل در Job، آن را به شکل زیر زمانبندی کنید:
در این روش، Job در زمان تعیینشده به صف ارسال میشود. برای پردازش واقعی آن باید Queue Worker هم فعال باشد. بنابراین، اجرای Scheduler بهتنهایی به معنی پردازششدن Jobهای صف نیست.
راهاندازی Laravel Scheduler روی سرور
پس از تعریف وظایف، باید Scheduler را روی سرور فعال کنید. این مرحله اهمیت زیادی دارد، زیرا بدون تنظیم Cron، وظایف زمانبندیشده بهصورت خودکار اجرا نمیشوند.
تنظیم Cron Job در لینوکس
ابتدا وارد سرور شوید و دستور زیر را اجرا کنید:
سپس خط زیر را به تنظیمات Cron اضافه کنید:
در این دستور باید مسیر پروژه را با مسیر واقعی برنامه جایگزین کنید.
برای مثال:
این Cron هر دقیقه دستور schedule:run را اجرا میکند. لاراول بررسی میکند که کدام وظایف باید در آن زمان اجرا شوند.
تنظیم Cron در cPanel
اگر پروژه لاراول روی هاست اشتراکی با کنترلپنل cPanel قرار دارد، معمولا نیازی به دسترسی SSH ندارید.
برای راهاندازی Cron مراحل زیر را انجام دهید:
- وارد کنترلپنل cPanel شوید.
- بخش Cron Jobs را باز کنید.
- گزینه تنظیم Cron جدید را انتخاب کنید.
- زمان اجرا را روی یک دقیقه تنظیم کنید.
- دستور اجرای Scheduler را در قسمت Command وارد کنید.
- تنظیمات را ذخیره کنید.
در قسمت Command میتوانید از دستور زیر استفاده کنید:
در این دستور، USERNAME و مسیر پروژه باید متناسب با اطلاعات هاست تغییر کنند. مسیر PHP هم ممکن است در سرورهای مختلف متفاوت باشد.
اگر از نسخه خاصی از PHP استفاده میکنید، بهتر است مسیر اجرایی همان نسخه را در Cron قرار دهید. در هاستهای cPanel معمولا میتوانید مسیر PHP را از طریق پشتیبانی هاست یا تنظیمات سرور دریافت کنید.
بررسی عملکرد و عیبیابی Laravel Scheduler
پس از تنظیم Cron، بهتر است عملکرد Scheduler را بررسی کنید. صرفا ثبت Cron Job به معنی اجرای موفق وظایف نیست.
لاراول چند دستور کاربردی برای بررسی وضعیت زمانبندی در اختیار شما قرار میدهد.
مشاهده فهرست وظایف زمانبندیشده
برای مشاهده تمام وظایف تعریفشده، دستور زیر را اجرا کنید:
این دستور اطلاعاتی مانند زمان اجرای بعدی و برنامه زمانی هر وظیفه را نمایش میدهد.
اجرای دستی Scheduler
برای آزمایش عملکرد زمانبندی میتوانید دستور زیر را اجرا کنید:
با اجرای این دستور، لاراول وظایفی را که در زمان فعلی باید اجرا شوند، بررسی و اجرا میکند.
در محیط توسعه هم میتوانید از دستور زیر استفاده کنید تا Scheduler بهصورت مداوم اجرا شود:
جلوگیری از اجرای همزمان یک وظیفه
یکی از مشکلات رایج در زمانبندی، اجرای مجدد یک وظیفه قبل از پایان اجرای قبلی است.
برای مثال، فرض کنید یک گزارشگیری روزانه بیش از یک ساعت طول میکشد. اگر اجرای مجدد آن شروع شود، ممکن است مصرف منابع سرور افزایش پیدا کند یا اطلاعات تکراری تولید شوند.
برای جلوگیری از این مشکل، از withoutOverlapping استفاده کنید:
با این تنظیم، تا زمانی که اجرای قبلی وظیفه تمام نشده باشد، اجرای جدید آغاز نمیشود.
این قابلیت از قفلهای Cache لاراول استفاده میکند. بنابراین، تنظیم صحیح Cache در پروژه اهمیت دارد.
ثبت خروجی و خطاهای وظایف
برای بررسی مشکلات احتمالی، بهتر است خروجی دستورات زمانبندیشده را در فایل لاگ ذخیره کنید:
به این ترتیب، خروجی هر بار اجرا به انتهای فایل اضافه میشود و میتوانید وضعیت عملکرد دستور را بررسی کنید.
همچنین اگر چند وظیفه سنگین در یک زمان اجرا میشوند، میتوانید برای اجرای دستورات مستقل در پسزمینه از runInBackground استفاده کنید.
این قابلیت برای دستورات command و exec قابل استفاده است.
نکات مهم برای استفاده از Laravel Scheduler
برای داشتن یک سیستم زمانبندی پایدار، فقط تعریف وظایف کافی نیست. باید به منابع سرور، زمان اجرای عملیات و شرایط محیط اجرا هم توجه داشته باشید.
چند نکته مهم عبارتند از:
- برای عملیات سنگین، از Job و Queue استفاده کنید تا پردازش اصلی از Scheduler جدا بماند.
- برای جلوگیری از اجرای تکراری، از withoutOverlapping استفاده کنید.
- منطقه زمانی سرور و تنظیمات Laravel را بررسی کنید تا وظایف در ساعت موردنظر اجرا شوند.
- مسیر صحیح PHP و مسیر پروژه را در Cron وارد کنید.
- برای عملیات حساس، خروجی و خطاها را ثبت کنید.
- از اجرای دستورات غیرضروری در بازههای زمانی کوتاه خودداری کنید.
نکته دیگر این است که اگر پروژه روی چند سرور اجرا میشود، ممکن است یک وظیفه روی تمام سرورها اجرا شود. در چنین شرایطی، متد onOneServer میتواند از اجرای تکراری جلوگیری کند، البته به Cache مشترک و سازگار بین سرورها نیاز دارد.
جمعبندی
Laravel Scheduler یکی از قابلیتهای کاربردی لاراول برای مدیریت وظایف زمانبندیشده است. با استفاده از این ابزار میتوانید عملیات مختلف مانند ارسال ایمیل، پاکسازی اطلاعات، تولید گزارش و اجرای Jobها را بدون نیاز به تعریف Cron جداگانه برای هر وظیفه مدیریت کنید.
برای راهاندازی Scheduler روی سرور، کافی است وظایف را در ساختار مناسب نسخه لاراول تعریف کنید و یک Cron Job برای اجرای دستور schedule:run در هر دقیقه تنظیم کنید.
در نهایت، توجه به Queue، جلوگیری از اجرای همزمان وظایف و ثبت لاگها، به پایداری بیشتر برنامه کمک میکند. اگر Scheduler بهدرستی پیکربندی شود، بخش زیادی از عملیات تکراری پروژه بهصورت خودکار و قابل مدیریت اجرا خواهد شد.