In this article, you will learn how to use a queue in Laravel 9. There are times you will see some processes take time to load like email send, payment gateway, etc. When you send an email for verification or send an invoice then it takes time to load for sending the mail because it is services.
In this example, we will be creating one mail class and create a job class. You can send a test mail using a queue. Follow the below steps:
Step 1: Install Laravel 9
If you have installed the Laravel app, then go ahead and execute the below command:
composer create-project laravel/laravel example-app
Step 2: Create Mail Class with Configuration
Create an email for testing using the Laravel Mail facade. Run the below command:
php artisan make:mail SendEmailTest
Now, you will see a new folder “Mail” in the app directory with the SendEmailTest.php file. Use the below code:
app/Mail/SendEmailTest.php
<?php namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; class SendEmailTest extends Mailable { use Queueable, SerializesModels; /** * Create a new message instance. * * @return void */ public function __construct() { } /** * Build the message. * * @return $this */ public function build() { return $this->view('emails.test'); } }
Ok, now we require to create an email view using a blade file. So we will create a simple view file and copy the below code on the following path.
resources/views/emails/test.blade.php
<!DOCTYPE html> <html> <head> <title>How to send mail using queue in Laravel 9?</title> </head> <body> <center> <h2 style="padding: 23px;background: #b3deb8a1;border-bottom: 6px green solid;"> <a href=" https://mywebhostguru.com/">Visit Our Website : Webhostguru.com</a> </h2> </center> <p>Hi, Sir</p> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> <strong>Thank you Sir. :)</strong> </body> </html>
After the view file has been configured and set up for email send, Let’s set the configuration in the .env file:
.env
MAIL_MAILER=smtp MAIL_HOST=smtp.gmail.com MAIL_PORT=465 MAIL_USERNAME=mygoogle@gmail.com MAIL_PASSWORD=rrnnucvnqlbsl MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=mygoogle@gmail.com MAIL_FROM_NAME="${APP_NAME}"
Step 3: Queue Configuration
Let’s make configuration on the queue driver and then set the queue driver “database”. Define the driver as Redis and the database driver on the “.env” file
.env
QUEUE_CONNECTION=database
Now, generate migration and create tables for the queue. Run the below command for queue database tables:
Generate Migration:
php artisan queue:table
Run Migration
php artisan migrate
Step 4: Create Queue Job
Create a queue job by using the below command, this command creates a queue job file with Queueable. Run the below command:
php artisan make: job SendEmailJob
Now, you have the SendEmailJob.php file in the “Jobs” directory. Use the below command:
app/Jobs/SendEmailJob.php
<?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 App\Mail\SendEmailTest; use Mail; class SendEmailJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; protected $details; /** * Create a new job instance. * * @return void */ public function __construct($details) { $this->details = $details; } /** * Execute the job. * * @return void */ public function handle() { $email = new SendEmailTest(); Mail::to($this->details['email'])->send($email); } }
Step 5: Test Queue Job
Now, use and test created queue job, so let’s create simple using the below code for the testing created queue.
routes/web.php
Route::get('email-test', function(){ $details['email'] = 'your_email@gmail.com'; dispatch(new App\Jobs\SendEmailJob($details)); dd('done'); }); Next, run the following command to see the queue process:
php artisan queue: work
You will see the layout as the like below if queue is working:
Run Laravel App
Type the given below command and hit enter to run the Laravel app:
php artisan serve
Now, visit your web browser, type the given URL and view the app output:
Keep Laravel Queue System Running on Server
We need to keep running the “php artisan work” command on the terminal because then the queue will work. Therefore server, you need to keep running using Supervisor. A supervisor is a process monitor for the Linux operating system, and will automatically restart your queue: work processes if they fail.
Install the Supervisor using the below command:
Install Supervisor
sudo apt-get install supervisor
We need to configure the file on supervisor as below the following path, set project path, user, and output file location as well:
/etc/supervisor/conf.d/laravel-worker.conf
[program:laravel-worker] process_name=%(program_name)s_%(process_num)02d command=php /home/forge/app.com/artisan queue:work --tries=3 autostart=true autorestart=true stopasgroup=true killasgroup=true user=forge numprocs=8 redirect_stderr=true stdout_logfile=/home/forge/app.com/worker.log stopwaitsecs=3600
Next, start the supervisor using the below commands:
sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start laravel-worker:*
Now you can check it, from your end.