Laravel Queue cung cấp một phương pháp để xử lý công việc nền (background jobs), chẳng hạn như gửi email, xử lý hình ảnh, hoặc các tác vụ mất thời gian, mà không làm chậm ứng dụng web của bạn. Queue cho phép các công việc này được đưa vào hàng đợi và xử lý sau, trong khi người dùng có thể tiếp tục sử dụng ứng dụng mà không bị ảnh hưởng.
Laravel hỗ trợ nhiều loại driver cho queue, như database, Redis, SQS, Beanstalkd, sync, và null. Bạn có thể chọn driver phù hợp với yêu cầu và môi trường của bạn.
Laravel sử dụng cấu hình trong file config/queue.php để định nghĩa các driver cho
queue. Mặc định, Laravel cung cấp một số driver, bạn có thể thay đổi các cấu hình này theo nhu cầu
của mình.
'default' => env('QUEUE_CONNECTION', 'sync'),
Laravel hỗ trợ nhiều driver khác nhau, bao gồm:
jobs trong cơ sở dữ liệu để xử lý.
Để tạo một job trong Laravel, bạn có thể sử dụng Artisan command:
php artisan make:job SendEmailJob
Lệnh trên sẽ tạo một lớp job mới trong thư mục app/Jobs. Sau đó, bạn có thể thêm logic
vào job đó. Ví dụ trong SendEmailJob, bạn có thể thêm các thuộc tính và phương thức như
sau:
namespace App\Jobs;
use App\Mail\SendEmail;
use Illuminate\Support\Facades\Mail;
class SendEmailJob extends Job
{
public $email;
public function __construct($email)
{
$this->email = $email;
}
public function handle()
{
Mail::to($this->email)->send(new SendEmail());
}
}
Sau khi tạo một job, bạn có thể dispatch job đó vào hàng đợi bằng cách sử dụng phương thức
dispatch:
SendEmailJob::dispatch($email);
Bạn có thể gửi job vào một queue cụ thể bằng cách thêm phương thức onQueue:
SendEmailJob::dispatch($email)->onQueue('emails');
Để xử lý các job trong hàng đợi, bạn cần chạy một worker. Bạn có thể chạy worker bằng lệnh sau:
php artisan queue:work
Lệnh này sẽ bắt đầu một worker và xử lý các job trong hàng đợi. Nếu bạn muốn worker chạy liên tục, bạn có thể sử dụng lệnh sau:
php artisan queue:listen
Nếu bạn muốn chỉ xử lý các job trong một queue cụ thể, bạn có thể sử dụng lệnh:
php artisan queue:work --queue=emails
Laravel hỗ trợ khả năng thử lại job nếu nó gặp lỗi. Bạn có thể chỉ định số lần retry trong file job của mình:
public $tries = 3;
Cấu hình này sẽ chỉ định số lần mà job có thể được thử lại nếu gặp lỗi. Nếu job tiếp tục thất bại
sau số lần thử, nó sẽ được đánh dấu là thất bại và bạn có thể lưu vào bảng failed_jobs.
Bạn có thể cấu hình các job thất bại và xử lý chúng bằng cách sử dụng bảng failed_jobs.
Laravel sẽ tự động lưu các job thất bại vào bảng này và bạn có thể xem chi tiết về các job thất bại.
Để cấu hình việc lưu trữ các job thất bại, bạn cần chạy migration:
php artisan queue:failed-table
Sau đó, chạy lệnh migration để tạo bảng:
php artisan migrate
Bạn có thể sử dụng lệnh để xem danh sách các job thất bại:
php artisan queue:failed
Supervisor giúp Laravel queue worker chạy liên tục và tự khởi động lại nếu gặp lỗi. Đây là cách cấu hình cơ bản:
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /path/to/artisan queue:work --sleep=3 --tries=3
autostart=true
autorestart=true
user=your-username
numprocs=8
redirect_stderr=true
stdout_logfile=/path/to/your/logs/laravel-worker.log
command: Lệnh chạy queue worker của Laravel.--sleep=3: Nếu không có job, worker sẽ nghỉ 3 giây trước khi thử lại.--tries=3: Job sẽ thử tối đa 3 lần trước khi bị đưa vào bảng
failed_jobs.numprocs=8: Chạy song song 8 worker.user: Tên người dùng hệ thống chạy lệnh (ví dụ: www-data).stdout_logfile: File log để giám sát worker.[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/laravel/artisan queue:work --sleep=3 --tries=3
autostart=true
autorestart=true
user=www-data
numprocs=4
redirect_stderr=true
stdout_logfile=/var/www/laravel/storage/logs/laravel-worker.log
/etc/supervisor/conf.d/laravel-worker.conf
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*
Laravel cung cấp hệ thống lập lịch mạnh mẽ thông qua Task Scheduling. Bạn có thể định
nghĩa các job hoặc command sẽ được thực thi theo khoảng thời gian định sẵn.
Để sử dụng tính năng này, bạn chỉ cần định nghĩa logic lập lịch trong phương thức
schedule của file app/Console/Kernel.php.
protected function schedule(Schedule $schedule)
{
$schedule->job(new SendEmailJob('example@example.com'))->everyMinute();
}
Các phương thức lập lịch phổ biến bao gồm:
->everyMinute()->hourly()->dailyAt('13:00')->weeklyOn(1, '8:00') (Thứ Hai lúc 8h sáng)->monthly()Để tính năng này hoạt động, bạn cần thêm dòng sau vào crontab server của bạn:
* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1
Laravel sẽ chạy lệnh này mỗi phút và xử lý các job được lên lịch tự động.