Scheduled Tasks در Laravel — Task Scheduling و Cron
Cron سرور هر شب backup میگیرد — اما پنج اسکریپت پراکنده با مسیر اشتباه. Laravel Scheduler یک entry cron دارد: schedule:run هر دقیقه — بقیه در کد PHP در routes/console.php تعریف میشود. تمیز، version control و testable.
تعریف schedule
use Illuminate\Support\Facades\Schedule;
Schedule::command('inspire')->hourly();
Schedule::call(function () {
DB::table('sessions')->where('last_activity', '<', now()->subDays(7)->timestamp)->delete();
})->daily();
Schedule::job(new PruneOldExports)->weekly();
فرکانسهای رایج
everyMinute، hourly، dailyAt('02:00')، weeklyOn(1, '8:00')، monthly، cron('0 */6 * * *').
جلوگیری از همپوشانی
Schedule::command('reports:generate')
->dailyAt('01:00')
->withoutOverlapping(60);
اگر اجرای قبلی هنوز تمام نشده، skip — برای job طولانی حیاتی.
یک سرور در cluster
Schedule::command('backup:run')->daily()->onOneServer();
نیاز cache redis برای lock — Redis.
Cron روی سرور
* * * * * cd /var/www/app && php artisan schedule:run >> /dev/null 2>&1
فقط این یک خط — Laravel بقیه را مدیریت میکند.
لیست و تست
php artisan schedule:list
php artisan schedule:test
php artisan schedule:work # local — هر دقیقه اجرا
مثالهای production
- پاکسازی failed_jobs — failed jobs
- sitemap generate — RSS این پورتفولیو
- backup database
- expire subscription
- queue:prune-batches
تفاوت Schedule و Queue
Schedule زمان ثابت؛ Queue event-driven. گاهی schedule یک job dispatch میکند — ترکیب درست.
timezone
Scheduler از config/app.php timezone — Asia/Tehran برای ایران.
جمعبندی
یک cron + routes/console.php = مرکز زمانبندی. Queue: مقدمه. Deploy: مقالات DevOps بعدی.