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 SQS , Redis, .. 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
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
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
{
//
}
}
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]);
}
}
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']);
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ể.
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
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.