LARAVEL TUTORIALS
10 thủ thuật Lavavel giúp bạn code nhanh hơn! Routing trong Laravel, cách tạo Route và sử dung AZ Tạo Middleware trong Laravel đơn giản trong 5 phút Xử lý Authentication và Authorization trong Laravel Event và listener trong Laravel, cách tạo và quản lý cơ bản nhất Tạo broadcast event trong Laravel dễ dàng trong 10 phút Xử lý Form Validation trong Laravel từ A - Z Cách tạo Session và cookie trong Laravel dễ dàng như ăn cháo Top 10 Package Lavavel thường dùng trong dự án Laravel Sử dụng Task trong Laravel đơn giản trong 10 phút. Cách tạo API trong Laravel đơn giản chỉ trong 5 phút Cách tạo job trong Laravel sao cho hiệu quả? Queues trong Laravel, dùng để xử lý các tác vụ mất nhiều thời gian Cache trong Laravel, các loại Cache thường dùng trong Laravel Redis trong Laravel, biết cách sử dung Redis Laravel trong 5 phút Sử dụng Memcache trong Laravel tăng tốc độ truy cập website Unit Test trong Laravel, thực hành tạo testing Laravel A-Z 10 thủ thuật tối ưu quá trình Testing trong Laravel Top 7 thư viện Testing Laravel được dùng nhiều nhất Testbench và Orchestra Testbench trong Laravel, kiểm thử Laravel dễ dàng Cách dùng Browser Testing (Laravel Dusk) trong Laravel Cách tạo test case cho Controller trong Laravel Cách tạo test case cho Model trong Laravel Cách tạo Database Testing trong Laravel Real-time web applications là gì ? Tầm quan trọng trong Laravel Laravel WebSockets, các bước tạo WebSockets trong Laravel Cách dùng Socket.io trong Laravel để tạo ứng dụng realtime Dùng Server-Sent Events trong Laravel để làm ứng dụng realtime Cách dùng Long polling trong Laravel để cải thiện trải nghiệm Cách tích hợp Vue.js vào Laravel và làm một ứng dụng căn bản Task Scheduling là gì? Cấu hình Task Scheduling trong Laravel Cách dùng Queue trong laravel để tạo tác vụ bất đồng bộ Cách dùng Event Sourcing trong Laravel Cách sử dụng CQRS trong Laravel từ A đến Z đơn giản Sử dụng Service Container trong Laravel dễ dàng Cách xử lý đa ngôn ngữ trong Laravel dễ dàng Tìm hiểu và sử dụng Service Provider trong Laravel Facades là gì? Cách dùng Facades trong Laravel Cách sử dụng Email Verification trong Laravel Cách dùng URL Generation trong Larevel Cách sử dụng Error Handling trong Laravel Cách dùng Encryption và decryption trong Laravel Cách sử dụng Relationships trong Laravel Bài 01: Laravel là gì? Hướng dẫn cài đặt laravel trên windows Sử dụng Event trong Laravel Một cách quản lý filter trong Laravel
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Cách tạo job trong Laravel sao cho hiệu quả?

Trong bài viết này, chúng ta sẽ tìm hiểu về cách sử dụng Job trong Laravel sao cho hiệu quả. Chúng ta sẽ bắt đầu với cách tạo và đăng ký Job, sau đó tìm hiểu về cách quản lý Job và xử lý lỗi trong quá trình thực thi. Cuối cùng, chúng ta sẽ đi sâu vào một số kỹ thuật tiên tiến để tối ưu hoá Job và tăng cường hiệu suất của ứng dụng.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Với những kiến thức này, bạn sẽ có thể sử dụng Job trong Laravel một cách hiệu quả và tối ưu cho ứng dụng của bạn, giúp cải thiện trải nghiệm người dùng và tăng tốc độ xử lý của ứng dụng.

1. Job trong laravel là gì ?

Job trong Laravel là một cơ chế xử lý các tác vụ bất đồng bộ (asynchronous tasks) trong ứng dụng Laravel. Điều này cho phép ứng dụng của bạn có thể xử lý các tác vụ lớn hoặc tác vụ tốn nhiều thời gian mà không làm gián đoạn hoạt động của ứng dụng.

Một job trong Laravel được định nghĩa trong một class riêng biệt, bao gồm các thông tin về công việc cần thực hiện, ví dụ như tên, dữ liệu cần xử lý và các tùy chọn khác. Sau đó, bạn có thể sử dụng phương thức dispatch() hoặc dispatchNow() của lớp Job để gửi một công việc bất đồng bộ tới hàng đợi (queue) để xử lý.

Bài viết này được đăng tại [free tuts .net]

Khi một job được gửi vào hàng đợi, nó sẽ được lưu trữ và đợi để được xử lý trong tương lai. Bạn cũng có thể định nghĩa các thành phần khác nhau để xử lý các job trong hàng đợi, chẳng hạn như một worker đơn giản hoặc sử dụng các hệ thống hàng đợi phức tạp hơn như Redis, Beanstalkd hoặc Amazon SQS.

Ví dụ :

Chúng ta có một ứng dụng đang sử dụng Laravel để xử lý đăng ký người dùng mới. Khi người dùng đăng ký mới, chúng ta muốn gửi email xác nhận đến người dùng để xác nhận tài khoản của họ. Tuy nhiên, việc gửi email có thể mất nhiều thời gian và gây ảnh hưởng đến hiệu suất của ứng dụng. Để giải quyết vấn đề này, chúng ta có thể sử dụng Job để gửi email xác nhận trong nền tảng.

Đầu tiên, chúng ta cần tạo một Job mới bằng lệnh Artisan:

php artisan make:job SendConfirmationEmailJob

Sau đó, chúng ta mở file SendConfirmationEmailJob.php và chỉnh sửa hàm handle() để gửi email xác nhận:

public function handle()
{
    // Lấy thông tin người dùng và gửi email xác nhận freetuts.net
    $user = User::find($this->userId);
    Mail::to($user->email)->send(new ConfirmationEmail($user));
}

Ở đây, chúng ta lấy thông tin của người dùng từ database và sử dụng Laravel Mail để gửi email xác nhận đến địa chỉ email của người dùng.

Tiếp theo, chúng ta cần đưa Job này vào hàng đợi bằng cách sử dụng lệnh dispatch():

SendConfirmationEmailJob::dispatch($user->id);

Ở đây, chúng ta truyền ID của người dùng vào trong hàm dispatch() để Job có thể lấy thông tin người dùng từ database.

Cuối cùng, chúng ta cần chạy Worker để thực hiện Job. Bằng cách sử dụng lệnh sau:

php artisan queue:work

Khi có Job mới được đưa vào hàng đợi, Worker sẽ lấy Job đó ra và thực hiện theo hàm handle() đã được định nghĩa trong Job.

2. Queue

Một ví dụ về cách tạo một Job trong Laravel và đưa nó vào queue

Tạo một Job mới bằng lệnh artisan

php artisan make:job SendEmail

Lệnh này sẽ tạo một file SendEmail.php trong thư mục app/Jobs với nội dung như sau:

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class SendEmail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    /**
     * Create a new job instance.
     *freetuts.net
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        // send email logic here
    }
}

Sử dụng phương thức 'dispatch()' để đưa Job vào queue

Ví dụ:nếu bạn muốn gửi email bằng Job này, bạn có thể gọi phương thức dispatch() trong controller hoặc trong một tác vụ khác của ứng dụng như sau:

​use App\Jobs\SendEmail;

SendEmail::dispatch();

Tùy chỉnh các thuộc tính của Job

Ví dụ:

use App\Jobs\SendEmail;

SendEmail::dispatch()->onQueue('emails')->delay(now()->addMinutes(10))->onConnection('redis');

4. Để xử lý các job trong hàng đợi

Bạn có thể chạy worker bằng lệnh artisan sau đây để kiểm tra trạng thái của các Job và xử lý các Job thất bại hoặc chưa hoàn thành :

php artisan queue:work

Lưu ý: Bạn cần cài đặt và cấu hình hệ thống hàng đợi trước khi sử dụng Job trong Laravel. Laravel hỗ trợ nhiều hệ thống hàng đợi như Redis, Beanstalkd và Amazon SQS. Bạn cần đọc tài liệu của từng hệ thống để cài đặt và cấu hình cho phù hợp với ứng dụng của mình.

3. Connection

Connection trong Laravel Job là một khái niệm cho biết nơi mà các job sẽ được đưa vào để thực thi. Laravel hỗ trợ nhiều loại connection cho job như database, Redis, Amazon SQS, beanstalkd và nhiều loại khác nữa.

Ví dụ, nếu bạn muốn sử dụng Redis làm connection cho các job, bạn có thể thực hiện các bước sau:

Cài đặt Redis

Trước khi bạn sử dụng Redis làm connection cho job, bạn cần cài đặt Redis trên máy tính của mình hoặc sử dụng một dịch vụ Redis trên mạng.

Cấu hình connection

Sau khi cài đặt Redis, bạn cần cấu hình connection trong file .env của ứng dụng Laravel của bạn:

QUEUE_CONNECTION=redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

Tạo và đưa Job vào Redis queue

Bây giờ, bạn có thể tạo một job và đưa nó vào Redis queue như sau:

use App\Jobs\SendEmail;

SendEmail::dispatch()->onQueue('emails')->delay(now()->addMinutes(10))->onConnection('redis');

Chạy các worker

Cuối cùng, bạn cần chạy các worker để thực thi các job trong queue. Bạn có thể sử dụng lệnh sau để chạy worker:

php artisan queue:work redis

Lệnh này sẽ chạy một worker sử dụng kết nối Redis và thực thi các job trong queue "emails".

Với connection Redis, bạn có thể thực hiện các Job đa luồng hoặc đa tiến trình một cách dễ dàng và tăng tốc độ xử lý cho các ứng dụng có khối lượng công việc lớn.

4. Worker

Worker trong Laravel là một tiến trình chạy trên máy chủ để thực thi các job trong queue. Khi các job được đưa vào queue, worker sẽ lấy các job này ra khỏi queue và thực thi chúng một cách đồng bộ hoặc không đồng bộ.

Chúng ta sẽ tạo một job để gửi email thông qua SMTP. Sau đó, chúng ta sẽ thêm job này vào queue và sử dụng worker để thực thi job.

Đầu tiên, chúng ta sẽ tạo một job để gửi email:

<?php

namespace App\Jobs;

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 SendEmail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $to;
    protected $subject;
    protected $body;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($to, $subject, $body)
    {
        $this->to = $to;
        $this->subject = $subject;
        $this->body = $body;
    }

    /**
     * Execute the job.
     *freetuts.net
     * @return void
     */
    public function handle()
    {
        Mail::raw($this->body, function ($message) {
            $message->to($this->to)
                    ->subject($this->subject);
        });
    }
}

Trong job này, chúng ta sử dụng Laravel Mail facade để gửi email thông qua SMTP. Job này có thể được thêm vào queue bằng cách sử dụng dispatch hoặc dispatchNow method, tùy thuộc vào việc bạn muốn thực thi job đồng bộ hay không đồng bộ.

// Thêm job vào queue freetuts.net
SendEmail::dispatch('example@example.com', 'Test email', 'This is a test email.');

// Thực thi job đồng bộ
SendEmail::dispatchNow('example@example.com', 'Test email', 'This is a test email.');

Sau khi job được thêm vào queue, chúng ta có thể sử dụng worker để thực thi job bằng lệnh queue:work:

php artisan queue:work

Khi worker thực thi job, Laravel sẽ gửi email tới địa chỉ 'example@example.com' với tiêu đề là 'Test email' và nội dung email là 'This is a test email'.. Nếu job thất bại, worker sẽ thực hiện retry lại job tùy thuộc vào cấu hình của queue.

5. Event

Event trong Laravel là một cơ chế cho phép các thành phần trong ứng dụng giao tiếp với nhau thông qua các sự kiện. Job cũng có thể được kết hợp với event để cho phép các job gửi sự kiện khi nó được thực thi hoặc hoàn thành. Điều này cho phép các thành phần khác trong ứng dụng có thể đăng ký để lắng nghe các sự kiện này và thực hiện các hành động phù hợp.

Ví dụ, chúng ta có thể tạo một job để tải xuống một file từ URL, sau đó gửi một sự kiện cho biết job đã tải xuống thành công hay thất bại. Để làm điều này, chúng ta có thể sử dụng event trong Laravel. Đầu tiên, chúng ta sẽ tạo một job để tải xuống file:

<?php

namespace App\Jobs;

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\Storage;
use Illuminate\Support\Facades\Http;

use App\Events\FileDownloaded;

class DownloadFile implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $url;
    protected $filename;

    /**
     * Create a new job instance.
     *freetuts.net
     * @return void
     */
    public function __construct($url, $filename)
    {
        $this->url = $url;
        $this->filename = $filename;
    }

    /**
     * Execute the job.
     *freetuts.net
     * @return void
     */
    public function handle()
    {
        // Download the file from the URL
        $response = Http::get($this->url);

        // Save the file to the storage
        Storage::put($this->filename, $response->body());

        // Dispatch an event to indicate that the file has been downloaded successfully
        event(new FileDownloaded($this->filename));
    }
}

Trong job này, chúng ta sử dụng thư viện Http của Laravel để tải xuống file từ URL. Sau đó, chúng ta sử dụng Storage facade của Laravel để lưu file xuống đĩa. Cuối cùng, chúng ta gửi một sự kiện FileDownloaded để cho biết job đã hoàn thành và tên file đã được tải xuống.

Tiếp theo, chúng ta sẽ tạo một listener để lắng nghe sự kiện FileDownloaded và thực hiện các hành động phù hợp:

<?php

namespace App\Listeners;

use App\Events\FileDownloaded;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;

class ProcessDownloadedFile implements ShouldQueue
{
    use InteractsWithQueue;

    /**
     * Handle the event.
     *freetuts.net
     * @param  FileDownloaded  $event
     * @return void
     */
    public function handle(FileDownloaded $event)
    {
        // Process the downloaded file
           // Log the download event
    logger()->info('File downloaded: ' . $event->filename);
}
}

Listener này được kích hoạt khi sự kiện `FileDownloaded` được gửi. Trong hàm `handle`, chúng ta có thể thực hiện các hành động phù hợp với việc xử lý file đã được tải xuống. Trong trường hợp này, chúng ta chỉ ghi log cho việc tải xuống file. Cuối cùng, chúng ta cần đăng ký listener này với sự kiện `FileDownloaded`. Chúng ta có thể thực hiện việc này trong `EventServiceProvider` của ứng dụng:


<?php

namespace App\Providers;

use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        'App\Events\FileDownloaded' => [
            'App\Listeners\ProcessDownloadedFile',
        ],
    ];

    /**
     * Register any events for your application.
     *freetuts.net
     * @return void
     */
    public function boot()
    {
        parent::boot();

        //
    }
}

Trong mảng '$listen', chúng ta đăng ký sự kiện 'FileDownloaded' với 'listener ProcessDownloadedFile'. Khi sự kiện 'FileDownloaded 'được gửi, ' listener ProcessDownloadedFile' sẽ được kích hoạt để xử lý sự kiện đó.

Để tạo job và đẩy nó vào queue, chúng ta có thể sử dụng method 'dispatch' của job như sau:

use App\Jobs\DownloadFile;

DownloadFile::dispatch('https://example.com/file.pdf', 'file.pdf');

Việc này sẽ tạo một job để tải xuống file từ URL và lưu vào đĩa với tên là 'file.pdf'. Khi job được thực thi, sự kiện 'FileDownloaded' sẽ được gửi và 'listener ProcessDownloadedFile' sẽ được kích hoạt để xử lý sự kiện này.

Đó là một ví dụ về việc sử dụng event với job trong Laravel. Bằng cách kết hợp job với event, chúng ta có thể tạo ra các kịch bản phức tạp trong ứng dụng và cho phép các thành phần khác trong ứng dụng tương tác với nhau thông qua các sự kiện.

Kết bài viết

Kết thúc bài viết này, chúng ta đã tìm hiểu về Job trong Laravel và các khái niệm liên quan đến nó như Queue, Connection, Worker, Event, ... Bên cạnh đó, chúng ta cũng đã thực hành một số ví dụ cơ bản để hiểu rõ hơn về cách sử dụng Job trong Laravel.

Job là một công cụ mạnh mẽ giúp xử lý các tác vụ nặng trong ứng dụng của chúng ta một cách hiệu quả, đồng thời tạo ra trải nghiệm tốt hơn cho người dùng. Sử dụng Job trong Laravel giúp chúng ta dễ dàng quản lý, xử lý và phân tán các tác vụ đòi hỏi nhiều tài nguyên hệ thống.

Mong rằng bài viết này sẽ giúp bạn hiểu rõ hơn về Job trong Laravel và sử dụng nó một cách hiệu quả trong các ứng dụng của bạn.

Nguồn tham khảo :

Link 1 : https://laravel.com/docs/10.x/queues#creating-jobs

Link 2 : https://viblo.asia/p/gioi-thieu-ve-queues-trong-laravel-gAm5yqgD5db

Cùng chuyên mục:

Cách sử dụng Relationships trong Laravel

Cách sử dụng Relationships trong Laravel

Cách dùng Encryption và decryption trong Laravel

Cách dùng Encryption và decryption trong Laravel

Cách sử dụng Error Handling trong Laravel

Cách sử dụng Error Handling trong Laravel

Cách dùng URL Generation trong Larevel

Cách dùng URL Generation trong Larevel

Cách sử dụng Email Verification trong Laravel

Cách sử dụng Email Verification trong Laravel

Facades là gì? Cách dùng Facades trong Laravel

Facades là gì? Cách dùng Facades trong Laravel

Tìm hiểu và sử dụng Service Provider trong Laravel

Tìm hiểu và sử dụng Service Provider trong Laravel

Sử dụng Service Container trong Laravel dễ dàng

Sử dụng Service Container trong Laravel dễ dàng

Cách xử lý đa ngôn ngữ trong Laravel dễ dàng

Cách xử lý đa ngôn ngữ trong Laravel dễ dàng

Cách sử dụng CQRS trong Laravel từ A đến Z đơn giản

Cách sử dụng CQRS trong Laravel từ A đến Z đơn giản

Cách dùng Event Sourcing trong Laravel

Cách dùng Event Sourcing trong Laravel

Task Scheduling là gì? Cấu hình Task Scheduling trong Laravel

Task Scheduling là gì? Cấu hình Task Scheduling trong Laravel

Cách dùng Queue trong laravel để tạo tác vụ bất đồng bộ

Cách dùng Queue trong laravel để tạo tác vụ bất đồng bộ

Cách tích hợp Vue.js vào Laravel và làm một ứng dụng căn bản

Cách tích hợp Vue.js vào Laravel và làm một ứng dụng căn bản

Cách dùng Long polling trong Laravel để cải thiện trải nghiệm

Cách dùng Long polling trong Laravel để cải thiện trải nghiệm

Dùng Server-Sent Events trong Laravel để làm ứng dụng realtime

Dùng Server-Sent Events trong Laravel để làm ứng dụng realtime

Cách dùng Socket.io trong Laravel để tạo ứng dụng realtime

Cách dùng Socket.io trong Laravel để tạo ứng dụng realtime

Laravel WebSockets, các bước tạo WebSockets trong Laravel

Laravel WebSockets, các bước tạo WebSockets trong Laravel

Real-time web applications là gì ? Tầm quan trọng  trong Laravel

Real-time web applications là gì ? Tầm quan trọng trong Laravel

Cách tạo Database Testing trong Laravel

Cách tạo Database Testing trong Laravel

Top