Laravel's task scheduling feature makes it incredibly simple to automate repetitive tasks — whether it’s sending reports, cleaning up logs, or triggering notifications. In this blog post, we'll walk through how to create a custom Artisan command and schedule it using Laravel’s built-in scheduler.

Introduction to Laravel Task Scheduling
Laravel, one of the most popular PHP frameworks for web development, offers a robust task scheduling system that allows developers to automate recurring tasks efficiently. Whether you need to send emails, clean databases, generate reports, or perform API calls at regular intervals, Laravel's task scheduler provides an elegant solution without relying on complex cron job configurations.
In this detailed tutorial, we'll explore how to create, register, and schedule custom Artisan commands in Laravel 8, 9, and 10 to automate your application's maintenance tasks.
Prerequisites for Laravel Scheduling
Before diving into task scheduling, ensure you have:
- Laravel framework installed (version 8.x or higher recommended)
- Basic understanding of PHP and Laravel concepts
- Access to your server's terminal or command line
- Proper server configuration to run scheduled tasks
Creating Custom Artisan Commands in Laravel
Step 1: Generate a New Command
First, let's create a custom command using Laravel's Artisan CLI tool:
BA
php artisan make:command SendDailyReportEmail
This command generates a new class in the app/Console/Commands
directory. The file will be named SendDailyReportEmail.php
.
Step 2: Configure the Command Structure
Open the newly created file and modify it as follows:
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Mail\DailyReport;
use Mail;
class SendDailyReportEmail extends Command
{
/**
* The name and signature of the command.
*
* @var string
*/
protected $signature = 'report:daily';
/**
* The command description.
*
* @var string
*/
protected $description = 'Send daily report email to administrators';
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
// Your command logic here
$users = \App\Models\User::where('is_admin', true)->get();
foreach ($users as $user) {
Mail::to($user->email)->send(new DailyReport());
}
$this->info('Daily report emails have been sent successfully!');
return Command::SUCCESS;
}
}
Registering Custom Commands in Laravel Kernel
Step 3: Register Your Command
To make your command available to Artisan, register it in the app/Console/Kernel.php
file:
protected $commands = [
\App\Console\Commands\SendDailyReportEmail::class,
];
In Laravel 8+ you can skip this step as commands are auto-discovered.
Implementing Laravel Task Scheduling
Step 4: Schedule Your Command
The real power of Laravel's task scheduler comes from the ability to configure task frequency using expressive, readable syntax. In the same Kernel.php
file, add your schedule in the schedule
method:
protected function schedule(Schedule $schedule)
{
// Daily at 8:00 AM
$schedule->command('report:daily')
->dailyAt('08:00')
->withoutOverlapping()
->emailOutputOnFailure('admin@example.com');
// Other scheduled tasks...
$schedule->command('cache:clear')->weekly();
$schedule->command('db:backup')->dailyAt('01:00');
}
Advanced Laravel Scheduling Options
Common Schedule Frequencies in Laravel
Laravel provides several helper methods to make scheduling easy and expressive:
Method | Description |
---|---|
->everyMinute() | Every minute |
->hourly() | Every hour |
->daily() | Once daily at midnight |
->dailyAt('13:00') | Every day at 1:00 PM |
->weekly() | Once a week |
->monthly() | Once a month |
->cron('* * * * *') | Custom CRON expression |
Task Output and Error Handling
Enhance your scheduled tasks with output and error handling:
$schedule->command('report:daily')
->dailyAt('08:00')
->appendOutputTo(storage_path('logs/daily-report.log'))
->emailOutputOnFailure('tech-team@example.com')
->onSuccess(function () {
// Actions to perform on successful execution
})
->onFailure(function () {
// Actions to perform when task fails
});
Configuring the Task Scheduler Cron Job
Step 5: Set Up the Scheduler
For the Laravel scheduler to run, you need to add a single cron entry to your server:
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
This cron job runs every minute and executes pending scheduled tasks.
For Laravel Forge users:
php /path-to-your-project/artisan schedule:run
Testing Scheduled Tasks in Laravel
Step 6: Test Your Command
Before relying on the scheduler, test your command manually:
php artisan report:daily
To see all registered commands:
php artisan list
Common Laravel Scheduling Use Cases
- Database maintenance: Schedule database backups, cleanup old records, or run migrations
- Cache management: Clear cache at regular intervals
- Report generation: Create and email reports during off-peak hours
- API synchronization: Keep your application in sync with external services
- User notifications: Send reminders or newsletters to users
- Queue monitoring: Check and restart failed queue workers
Troubleshooting Laravel Task Scheduler
Common Issues and Solutions
Tasks not running
- Verify cron job is set up correctly
- Check server timezone configuration
- Ensure proper file permissions
Permission problems
- Use
withoutOverlapping()
to prevent task overlap - Set appropriate timeouts for long-running tasks
- Use
Output management
- Use
appendOutputTo()
orsendOutputTo()
to capture command output - Implement proper logging for debugging
- Use
Conclusion
Laravel's task scheduling provides a powerful, expressive way to automate recurring tasks in your web applications. By following this guide, you've learned how to create custom commands, schedule them with various frequencies, and ensure they run reliably.
Implementing proper task scheduling can significantly improve application maintenance, user experience, and developer productivity by automating routine operations that would otherwise require manual intervention.
FAQs About Laravel Task Scheduling
Q: Can I run Laravel scheduler in a shared hosting environment?
A: Yes, though some shared hosts restrict cron job access. Check with your hosting provider about setting up the required cron job.
Q: How do I schedule a task to run only on weekdays?
A: Use ->weekdays()
method: $schedule->command('report:daily')->weekdays()->at('8:00');
Q: Can I run tasks every few minutes?
A: Yes, use methods like ->everyFiveMinutes()
, ->everyTenMinutes()
, or ->everyThirtyMinutes()
.
Q: How do I prevent task overlap if previous execution is still running?
A: Use the ->withoutOverlapping()
method to ensure a task won't start if the previous instance is still running.
Q: Can I schedule Laravel jobs instead of commands?
A: Yes, use $schedule->job(new ProcessPodcast)
to schedule jobs directly.