Click Below to subscribe

How To Implement Queue In Laravel 2022

Laravel queues provide a unified queueing API across a variety of different queue backends, such as Amazon SQS, Redis, or even a relational database.

It's better to use queue if you need to perform any time-consuming task(Example- Send Email). By Implementing queue we can perform these tasks in the background.

In this article, we will implement queue in laravel step by step.

1. Let's create a new laravel project.

composer create-project laravel/laravel laravel-queue

2. Update your database credentials in .env file.

DB_DATABASE=laravel-queue    // your database name
DB_USERNAME=root            // your database username 
DB_PASSWORD=               // your database password

3. Update queue connection in .env file.


4. Generate migration file for jobs table.

Note:- laravel by default usage jobs table for storing queue's data and failed_jobs table for failed queue's data if you want to use another table instead of jobs you can change it from config file.

Ref:- Illuminate\Queue\Console\TableCommand


'database' => [
    'driver' => 'database',
    'table' => 'jobs',        // here you can change table name
    'queue' => 'default',
    'retry_after' => 90,
    'after_commit' => false,

'failed' => [
    'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'),
    'database' => env('DB_CONNECTION', 'mysql'),
    'table' => 'failed_jobs',  // here you can change table name

Hit the following command to generate queue table migration

php artisan queue:table

This command will generate xxxx_create_jobs_table.php(based on the name set in queue.php) inside database/migrations directory.

Note:- laravel by default comes with xxxx_create_failed_jobs_table.php migration file so you don't need to generate migration for the failed_jobs table.

If you changed failed_jobs table in queue.php then you also need to generate migration for failed queues

php artisan queue:failed-table

5. Run migration

php artisan migrate

This command will migrate all migrations from database/migrations directory.

if you don't want to migrate all migration you can also only migrate queue tables.

php artisan migrate  --path=your migration file path

php artisan migrate  --path=database/migrations/2022_01_31_120052_create_jobs_table.php
php artisan migrate  --path=database/migrations/2019_08_19_000000_create_failed_jobs_table.php

6. Create a queue job.

php artisan make:job WelcomeEmailJob

This command will create WelcomeEmailJob.php inside app/Jobs directory.

7. Update handle method of WelcomeEmailJob.php.


namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Mail;

class WelcomeEmailJob implements ShouldQueue
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    private $userData;
     * Create a new job instance.
     * @return void
    public function __construct($userData)
        $this->userData = $userData;

     * Execute the job.
     * @return void
    public function handle()
        Mail::raw("Welcome {$this->userData['name']}", function($message) {
            $message->to($this->userData['email'])->subject('Laravel Queue');

8. Update Email credentials in .env file


9. Create a UserController for dispatching queue jobs.

php artisan make:controller UserController

10. Open UserController.php and create a function for dispatching WelcomeEmailJob


namespace App\Http\Controllers;

use App\Jobs\WelcomeEmailJob;
use Illuminate\Http\Request;

class UserController extends Controller
    public function sendMail()
        $userData = [
            'name' => 'Akash Verma',
            'email' => ''
        die('Email Sent.');

Note:- we can dispatch queue jobs by 4 ways.

Queue::push(new WelcomeEmailJob($userData)); 
dispatch(new WelcomeEmailJob($userData));
(new WelcomeEmailJob($userData))->dispatch();

By default dispatch job on the default queue. if you want to dispatch a job on a specific queue then you can use onQueue() method.


11. Create a route for calling sendMail() function.


use App\Http\Controllers\UserController;
use Illuminate\Support\Facades\Route;

| Web Routes
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!

Route::get('/send-mail', [UserController::class, 'sendMail']);

12. Start queue worker

php artisan queue:work

if you have pushed your job on a specific queue then

php artisan queue:work --queue=mailqueue  // job queue name

13. Finally hit send mail route in browser and check queue worker logs in the console.


2022-01-31 14:49:21][21] Processed: App\Jobs\WelcomeEmailJob - Indicates our queue job processed successfully.

Check out this Link - How to Run Laravel Queue Worker on Server

If you facing any issues. don't hesitate to comment below. I will be happy to help you.

Leave Your Comment