Phiên bản Laravel 8 đã được phát hành với một tính năng mà rất nhiều người trong chúng ta đã chờ đợi rất lâu đó là Jobs Batching, nó cho phép chúng ta thực hiện nhiều công việc trong cùng một lúc và theo dõi chúng thực hiện khi có bất kì lỗi nào xảy ra.

Đầu tiên, bạn hãy chạy các lệnh sau để tạo bảng job_batches để chứa các thông tin về job batches

php artisan queue:batches-table
php artisan migrate

Tìm batch bằng ID

Để truy xuất batch theo ID, bạn có thể dụng facade Bus với method findBatch

$batch = Bus::findBatch("909db655-ed38-4739-89ea-ca6c1b13a5a0")

Callbacks

Bus::batch() cung cấp một số chức năng dưới dạng callbacks:

+ then: khi công việc thực hiện thành công

+ catch: khi công việc thực hiện không thành công

+ finally: khi công việc kết thúc

$batch = Bus::batch([
    // jobs here
])->then(function (Batch $batch) {
    info('Batch ['.$batch->id.'] has been finished succesfully');
})->catch(function (Batch $batch, Throwable $e) {
    info('Batch ['.$batch->id.'] failed to process all jobs');
})->finally(function (Batch $batch) {
    info('Batch ['.$batch->id.'] finished proccessing');
})->dispatch();

Batch Object là tập hợp các thuộc tính rất hay cung cấp cho chúng ta các thông tin cần thiết về batch và những gì đang xảy ra đối với các job của batch.

{
    id: "941eaf3c-7e03-4861-92b9-49713402b9e4",
    name: "",
    total_jobs: 0,
    pending_jobs: 0,
    failed_jobs: 0,
    failed_job_ids: "[]",
    options: "a:0:{}",
    cancelled_at: null,
    created_at: 1628595099,
    finished_at: null
}

Bây giờ, sau khi khám phá tính năng, chúng ta hãy làm một ví dụ để hiểu rõ về job batches hơn

Đầu tiên, chúng ta tạo phải job có nhiệm vụ là thêm data giả vào bảng users, để tạo job bạn hãy chạy lệnh command sau

php artisan make:job CreateUserJob

Tiếp theo, bạn hay mở file CreateUserJob.php nằm trong thư mục app/Jobs và chỉnh sửa như sau

<?php

namespace App\Jobs;

use Illuminate\Bus\Batchable;
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 CreateUserJob implements ShouldQueue
{
    use Batchable, Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        \App\Models\User::factory(10)->create();
    }
}

Lưu ý, khi bạn sử dụng job batches, bạn cần sử dụng thêm facade bên dưới, mặc định khi tạo job facade bên dưới không được thêm vào

use Illuminate\Bus\Batchable;

Kiểm tra hoạt động Laravel Job Batches

Trong bước này, chúng ta cần thêm một controller để thực hiện job trên.

Để làm được điều này, bạn hãy chạy lệnh command sau

php artisan make:controller TestQueueJobController

Tiếp theo, bạn hãy mở TestQueueJobController và chỉnh sửa như sau

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Jobs\CreateUserJob;
use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Bus;
use Throwable;

class TestQueueJobController extends Controller
{
    /**
    * Test Job Batches
    **/
    public function run()
    {
        $batch = Bus::batch([
            new CreateUserJob(),
            new CreateUserJob()
        ])->dispatch();
    }
}

Tiếp theo, bạn mở routes/web.php và thêm dòng bên dưới vào

Route::get('job-batches', [App\Http\Controllers\TestQueueJobController::class,'run']);

Sau đó, bạn hãy mở trình duyệt và truy cập vào url /job-batches để thực hiện công việc thêm user.

Sau khi một công việc được thực hiện, bạn cần xử lý queue, đối với điều này, bạn cần sử dụng lệnh command sau

php artisan queue:work

Cuối cùng, khi công việc thực hiện xong, bạn sẽ có thêm 20 user mới trong bảng users.

Như vậy, chúng ta đã thực hiện xong một ví dụ đơn giản về Laravel Queue, tôi hy vọng hướng dẫn của tôi sẽ giúp ích cho công việc của bạn. Nếu bạn có bất kỳ câu hỏi nào hãy liên hệ với chúng tôi qua trang contact. Cảm ơn bạn.

CÓ THỂ BẠN QUAN TÂM

Laravel One to One Eloquent Relationship

Laravel One to One Eloquent Relationship

Mối quan hệ một-một là một mối quan hệ rất cơ bản. Trong hướng dẫn này, tôi sẽ hướng dẫn bạn cách tạo dữ liệu và truy xuất dữ liệu bằng Eloquent Model. Trong hướng dẫn này, tôi sẽ tạo hai bảng là u...

Laravel Routing

Laravel Routing

Route là gì? Đúng như tên gọi của nó, Route thực hiện chức năng định tuyến, dẫn đường cho các HTTP request gửi đến đúng nơi mà ta mong muốn. Với sự phát triển mạnh mẽ của ứng dụng web ngày nay, việc...

Laravel Facades

Laravel Facades

Facade là gì? Chúng ta có thể hiểu Facade là mặt tiền và mặt trước của một tòa nhà hay bất cứ thứ gì. Tầm quan trọng của Facade là chúng có thể dễ nhận thấy và nổi bật hơn, tương tự như vậy, thì...

Laravel Factories, Seeder

Laravel Factories, Seeder

Trong bài viết này, tôi sẽ hướng dẫn các bạn về cách tạo dữ liệu giả trong cơ sở dữ liệu bằng cách sử dụng Laravel Factory và Seed trong Database Seeder. Để tạo model factory, bạn cần chạy lệnh sau...

Laravel Artisan Console

Laravel Artisan Console

Ngoài các lệnh command mặc định của Laravel được cung cấp bởi Artisan, có rất nhiều tác vụ trong ứng dụng Laravel của bạn có thể được xử lý rất tốt bằng các lệnh command này. Nhưng đôi khi có nhiều tá...

Laravel Socialite Login With Gitlab

Laravel Socialite Login With Gitlab

GitLab GitLab là kho lưu trữ Git dựa trên web cung cấp các kho lưu trữ mở và riêng tư miễn phí, các khả năng theo dõi vấn đề và wiki. Đây là một nền tảng DevOps hoàn chỉnh cho phép các chuyên gia...

How to insert into a database at lightning speed?

How to insert into a database at lightning speed?

Trong quá trình thực hiện dự án cho công ty, một trong những yêu cầu đặt ra là import dữ liệu từ file CSV (chứa dữ liệu từ hệ thống cũ) vào cơ sở dữ liệu MySQL của hệ thống mới. Do sự thay đổi cấu...

Eloquent Methods: whereDoesntHaveRelation and whereMorphDoesntHaveRelation

Eloquent Methods: whereDoesntHaveRelation and whereMorphDoesntHaveRelation

New Laravel 11.37: Eloquent Methods Laravel cung cấp cho chúng ta khả năng xây dựng các truy vấn dữ liệu mạnh mẽ với Eloquent ORM, giúp chúng ta có thể xử lý các truy vấn cơ sở dữ liệu phức tạp một...

Laravel Middlewares

Laravel Middlewares

Middleware cung cấp một cơ chế thuận tiện để lọc các yêu cầu HTTP gửi đến ứng dụng bạn. Nó là một lớp trung gian nằm giữa request và controller. Bạn có thể thêm các xử lý logic trước khi gửi đến contr...

ManhDanBlogs