Sử dụng Laravel Queues trên shared hosting
Để sử dụng Laravel Queues trên hosting chia sẻ (shared hosting), việc này có thể hơi phức tạp vì nhiều nhà cung cấp hosting chia sẻ hạn chế việc truy cập vào các dịch vụ hệ thống như Supervisor hoặc các worker chuyên quản lý queue. Tuy nhiên, bạn vẫn có thể triển khai queues bằng một số giải pháp thay thế. Dưới đây là các bước sử dụng Queues trên Shared Hosting bạn có thể thiết lập:
Bước 1: Cấu hình Queue trong Laravel
Trong file config/queue.php
, đảm bảo rằng driver queue của bạn đang được đặt là database
, đây là lựa chọn phù hợp nhất cho shared hosting vì nó không yêu cầu các dịch vụ bên ngoài như Redis hoặc Beanstalkd.
'default' => env('QUEUE_CONNECTION', 'database'),
PHPSau đó, chạy các lệnh sau để tạo bảng cần thiết cho driver database queue:
php artisan queue:table
php artisan migrate
BashBước 2: Tạo Mail Class
Laravel hỗ trợ tạo một Mail Class dễ dàng. Chạy lệnh sau để tạo Mail Class:
php artisan make:mail SendMail --markdown=emails.demoMail
BashThao tác này sẽ tạo một file trong thư mục app/Mail/SendMail.php
. Tại đây, bạn có thể định nghĩa nội dung email và các thông tin khác như người nhận, tiêu đề, v.v.
Bước 3: Cấu hình Mail Class SendMail
Mở file app/Mail/SendMail.php
và cập nhật như sau:
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendMail extends Mailable
{
use Queueable, SerializesModels;
public $data;
/**
* Create a new message instance.
*
* @param array $data
* @return void
*/
public function __construct($data)
{
$this->data = $data;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->subject($this->data['subject'])
->markdown('emails.demoMail')
->with('data', $this->data);
}
}
PHPBước 4: Cấu hình View Template cho Email
Bạn cần sửa nôị dung file trong thư mục resources/views/emails/demoMail.blade.php
:
<!-- resources/views/emails/demoMail.blade.php -->
@component('mail::message')
# {{ $data['subject'] }}
{{ $data['message'] }}
Thanks,<br>
{{ config('app.name') }}
@endcomponent
BladeBước 5: Định nghĩa Job gửi Email
Để gửi mail thông qua queue, bạn cần tạo một Job. Thực hiện lệnh sau:
php artisan make:job SendMailJob
BashSau khi tạo, Laravel sẽ thêm một file mới vào app/Jobs/SendMailJob.php
. Trong file này, bạn sẽ sử dụng Mail Class để gửi email.
Ví dụ mã trong SendMailJob
:
<?php
namespace App\Jobs;
use App\Mail\SendMail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Mail;
class SendMailJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $emailData;
public function __construct($emailData)
{
$this->emailData = $emailData;
}
public function handle()
{
Mail::to($this->emailData['to'])->send(new SendMail($this->emailData));
}
}
PHPTrong đó, $emailData
là dữ liệu email cần thiết như địa chỉ người nhận, tiêu đề, nội dung, v.v.
Bước 6: Dispatch Job để gửi Mail
Khi muốn gửi email qua job, bạn có thể gọi job trong controller hoặc ở bất cứ đâu như sau:
use App\Jobs\SendMailJob;
$emailData = [
'to' => 'user@example.com',
'subject' => 'Test Email',
'message' => 'This is a test email.',
];
SendMailJob::dispatch($emailData);
PHPBước 7: Sử dụng queue:work với Cron Job
Vì shared hosting thường không cho phép chạy lệnh queue:work dưới dạng một process nền (background process), bạn có thể mô phỏng điều này bằng cách sử dụng cron job để lên lịch chạy worker.
Tạo 1 cron job trên server. Lệnh này sẽ chạy command queue:work mỗi phút. Để thiết lập cron job, bạn vào phần quản lý hosting (thường là cPanel hoặc tương tự) và tìm phần Cron Jobs. Thêm một cron job mới chạy mỗi phút:
* * * * * /usr/local/bin/php /path-to-your-project/artisan queue:work --stop-when-empty >> /path-to-logs-folder-on-server/queue_work_run.log 2>&1
Bash- Đảm bảo thay thế /path-to-your-project bằng đường dẫn chính xác tới dự án Laravel của bạn.
- Đảm bảo thay thế /path-to-logs-folder-on-server bằng đường dẫn chính xác tới thư mục logs trên server của bạn, thường là /home/username/logs
Bước 8: Giới hạn số lượng Jobs được xử lý
Để tránh các vấn đề về hiệu suất trên shared hosting, bạn có thể giới hạn số lượng jobs được xử lý trong một lần chạy. Bạn có thể sử dụng tùy chọn --max-jobs
khi lên lịch cho lệnh queue:work
, như sau:
queue:work --stop-when-empty --max-jobs=3
BashBước 9: Lưu ý khi triển khai
- Tối ưu hiệu suất Queue
◆ Vì shared hosting có tài nguyên hạn chế, hãy đảm bảo các queue của bạn được tối ưu:
・Giảm kích thước payload của từng job.
・Giữ cho các job đơn giản và thời gian chạy ngắn.
・Sử dụng cơ chế retry trong trường hợp job bị lỗi, nhưng tránh retry quá nhiều lần.
◆ Sử dụng Queue Database như một Giải pháp Thay Thế - Nếu bạn không muốn sử dụng cron job, một giải pháp khác là sử dụng lệnh queue:listen thay vì queue:work. Tuy nhiên, cách này ít hiệu quả hơn vì nó không dừng lại khi không có job, điều này có thể tiêu tốn nhiều tài nguyên hơn. Đây vẫn là một lựa chọn cho môi trường shared hosting cơ bản.