Laravel Queues - Hướng dẫn dùng hàng đợi Queue

laravel queues - hướng dẫn dùng hàng đợi queue
Trong bài viết này, chúng ta sẽ thảo luận về cách Laravel Queues hoạt động. Laravel là một trong những framework PHP hiện đại tốt nhất và dễ sử dụng nhất.

  1. Giới thiệu về Queue

Các cấu hình hàng đợi được lưu trữ trong  tệp “config/queue.php” . Trong tệp này, chúng ta sẽ tìm cấu hình kết nối cho từng queue driver. Một số công cụ đã được bao gồm trong queue, ví dụ như Database ,  Amazon SQSRedis, .. và trình điều khiển đồng bộ (sync) sẽ thực thi công việc ngay lập tức (để sử dụng cục bộ).

Bạn có thể kiểm tra tài liệu chính thức để tìm hiểu sâu hơn về Queues.

https://laravel.com/docs/10.x/queues

  1. Thiết lập CSDL cho Laravel Queue

Chúng ta sẽ sử dụng CSDL cho ví dụ Laravel Queue. Bạn có thể sử dụng lệnh sau để tạo bảng queue.

php artisan queue:table


Lệnh trên tạo một tệp migration tại  thư mục database/migrations . Tệp đã tạo chứa schema cho bảng jobs.



use Illuminate\Database\Migrations\Migration;

use Illuminate\Database\Schema\Blueprint;

use Illuminate\Support\Facades\Schema;


return new class extends Migration

{

    /**

     * Run the migrations.

     */

    public function up(): void

    {

        Schema::create('jobs', function (Blueprint $table) {

            $table->bigIncrements('id');

            $table->string('queue')->index();

            $table->longText('payload');

            $table->unsignedTinyInteger('attempts');

            $table->unsignedInteger('reserved_at')->nullable();

            $table->unsignedInteger('available_at');

            $table->unsignedInteger('created_at');

        });

    }


    /**

     * Reverse the migrations.

     */

    public function down(): void

    {

        Schema::dropIfExists('jobs');

    }

};

Bây giờ đã đến lúc chạy lệnh migrate, lệnh migrate tạo một bảng jobs trong cơ sở dữ liệu của bạn.

php artisan migrate

Cơ sở dữ liệu cuối cùng đã được cập nhật, bây giờ là lúc để cập nhật hàng đợi hiện tại của chúng ta cho ứng dụng Laravel. Bạn chỉ cần cập nhật  file ‘.env’ của mình.

QUEUE_DRIVER=database

  1. Tạo Job

Bây giờ, chúng ta cần tạo một job bằng lệnh artisan sau.

php artisan make:job SendWelcomeMail

Sau khi thực hiện lệnh trên, 1 class mới được tạo tại  thư mục app/Jobs . Theo mặc định, thư mục này không có sẵn trong ứng dụng Laravel. Nó được tạo khi chúng ta chạy lệnh trên.


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;


class SendWelcomeMail implements ShouldQueue

{

    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;


    /**

     * Create a new job instance.

     */

    public function __construct()

    {

        //

    }


    /**

     * Execute the job.

     */

    public function handle(): void

    {

        //

    }

}

  1. Tạo Mail

Bạn có thể sử dụng lệnh đã cho để tạo một lớp Mail mới.

php artisan make:mail WelcomeMail

Sau khi tạo lớp mail. Chúng ta cần cập nhật chức năng xây dựng trả về một chế độ xem.


namespace App\Mail;


use Illuminate\Bus\Queueable;

use Illuminate\Contracts\Queue\ShouldQueue;

use Illuminate\Mail\Mailable;

use Illuminate\Mail\Mailables\Content;

use Illuminate\Mail\Mailables\Envelope;

use Illuminate\Queue\SerializesModels;


class WelcomeMail extends Mailable

{

    use Queueable, SerializesModels;


    public $name = '';

    /**

     * Create a new message instance.

     *

     * @return void

     */

    public function __construct($username)

    {

        $this->name = $username;

    }

    /**

     * Build the message.

     *

     * @return $this

     */

    public function build()

    {

        return $this->view('emails.welcome')->with(['name' => $this->name]);

    }

}

  1. Thiết lập Routes

Bạn cần thêm route sau vào  tệp routes/web.php của mình .

Route::get('email', [JobController::class, 'processQueue']);

  1. Tạo Controller

Bạn có thể sử dụng lệnh đã cho để tạo Controller để xử lý công việc xếp hàng.

php artisan make:controller JobController

Sau khi tạo Controller, chúng ta cần xử lý JobController.

namespace App\Http\Controllers;


use Illuminate\Http\Request;

use App\Jobs\SendWelcomeMail;

class JobController extends Controller

{

    /**

     * Handle Queue Process

     */

    public function processQueue()

    {

        dispatch(new SendWelcomeMail('Sender Code'));

        echo 'Mail Sent';

    }

}


Sau đó kiểm tra CSDL, nơi chúng ta tạo một bảng jobs. Bảng jobs chứa một bản ghi. Nó đang lưu trữ bản ghi khi chúng ta gọi đến routes cụ thể.

Hàng đợi Laravel

Bây giờ câu hỏi là tại sao? Nó bởi vì quá trình của công việc không được bắt đầu. Bạn cần chạy lệnh artisan  queue:work sau đây .

php artisan queue:work

  1. Trì hoãn việc gửi Mail

Nếu chúng ta muốn thêm độ trễ trong hàng đợi của mình, thì bạn có thể sử dụng Carbon. Carbon đã được thêm vào Laravel framework. Bạn chỉ cần nhập vào lớp của bạn.

namespace App\Http\Controllers;


use Illuminate\Http\Request;

use App\Jobs\SendWelcomeMail;

use Carbon\Carbon;


class JobController extends Controller

{

    /**

     * Handle Queue Process

     */

    public function processQueue()

    {

        $emailJob = (new SendWelcomeMail('Test Queue'))->delay(Carbon::now()->addSeconds(3));

           dispatch($emailJob);

           echo 'Mail Sent';

  }

}


Phần kết luận

Trong bài viết này, mình đang cố gắng giải thích cho bạn cách Laravel Queues hoạt động. Mình hy vọng bạn đã hiểu rõ về Laravel queue. Nhưng lưu ý rằng chúng ta phải chạy  lệnh queue:work trên máy chủ. Mặt khác, tất cả các công việc xếp hàng được lưu trữ trong CSDL.