DEV Community

Oluwajubelo
Oluwajubelo

Posted on

Understanding Cron Jobs in Laravel

Imagine you own a poultry farm ๐Ÿ”, and every morning at exactly 6 AM, you need to feed your chickens automatically. You donโ€™t want to wake up early every day to do it manually. So, you buy an automatic feeder that dispenses food at 6 AM on its own.

In Laravel, a cron job is like your automatic feeder. It allows you to schedule tasks that should run automatically at a specific time.

Why Do You Need a Cron Job?
Let's say you are running an e-commerce website ๐Ÿ›’, and you want to send a reminder email to customers every day at 9 AM about items left in their cart. Instead of sending these emails manually, you can create a Laravel cron job that handles it automatically.

How to Set Up a Cron Job in Laravel

Step 1: Create a Laravel Command

Laravel provides a way to define scheduled tasks using artisan commands. To create a new command, run:

php artisan make:command SendCartReminderEmails
Enter fullscreen mode Exit fullscreen mode

This will generate a file inside app/Console/Commands/ named SendCartReminderEmails.php.

Step 2: Define the Commandโ€™s Logic

Open the file app/Console/Commands/SendCartReminderEmails.php, and you will see a handle() method. This is where you define what should happen when the command runs.

Modify the handle() method like this:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\Models\User;
use App\Mail\CartReminderMail;
use Illuminate\Support\Facades\Mail;

class SendCartReminderEmails extends Command
{
    protected $signature = 'email:cart-reminder'; // Command name
    protected $description = 'Send reminder emails to users about items in their cart';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        $users = User::whereHas('cart')->get(); // Get users with items in their cart

        foreach ($users as $user) {
            Mail::to($user->email)->send(new CartReminderMail($user));
        }

        $this->info('Cart reminder emails sent successfully!');
    }
}
Enter fullscreen mode Exit fullscreen mode

Step 3: Schedule the Command in Kernel

Now that we have our command, we need to tell Laravel when it should run.

Open app/Console/Kernel.php and inside the schedule() method, add:

protected function schedule(Schedule $schedule)
{
    $schedule->command('email:cart-reminder')->dailyAt('09:00'); // Runs every day at 9 AM
}
Enter fullscreen mode Exit fullscreen mode

Here are other ways you can schedule a job:

Schedule Expression

Step 4: Register Laravel's Scheduler in Crontab

Laravelโ€™s scheduler does not run on its own. You need to register it in your serverโ€™s crontab (a list of scheduled tasks for Linux).

Run:

crontab -e
Enter fullscreen mode Exit fullscreen mode

Then add this line at the bottom:

* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1
Enter fullscreen mode Exit fullscreen mode

๐Ÿ”น Explanation:

* * * * * โ†’ Runs the Laravel scheduler every minute
php /path-to-your-project/artisan schedule:run โ†’ Runs Laravel's scheduled tasks
>> /dev/null 2>&1 โ†’ Hides output (optional)

Step 5: Test the Cron Job Manually

Before waiting for it to run automatically, you can test it by running:

php artisan schedule:run
Enter fullscreen mode Exit fullscreen mode

If everything is set up correctly, Laravel will execute the job immediately.

Final Thoughts

Just like how your automatic chicken feeder makes your life easier, cron jobs in Laravel help automate repetitive tasks like sending emails, clearing old records, or updating reports.

So now, instead of manually reminding users about their abandoned carts, your Laravel application will automatically do it for you every morning at 9 AMโ€”just like clockwork! ๐Ÿ•˜๐Ÿ””

Would you like help setting up cron jobs for other use cases? ๐Ÿ˜Š

Top comments (0)