Sử dụng Laravel Queues trên shared hosting

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'),
PHP

Sau đó, 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
Bash

Bướ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
Bash

Thao 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);
    }
}
PHP

Bướ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
Blade

Bướ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
Bash

Sau 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));
    }
}
PHP

Trong đó, $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);
PHP

Bướ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
Bash

Bướ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.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *