Giới thiệu
Trong phát triển web hiện đại, tốc độ và khả năng phản hồi là điều tối quan trọng. Một website hoặc ứng dụng chậm có thể gây ra sự không hài lòng hoặc thất vọng cho người dùng.
Hàm defer()
là một helper function được giới thiệu lần đầu trong bản Laravel 11.23, phát hành vào khoảng Tháng 9 – Tháng 11 năm 2024, giúp đơn giản hóa bằng cách gói các tác vụ vào một closure, sẽ được Laravel tự động thực thi sau khi response đã được gửi tới client, mà không cần thiết lập queue driver hay worker.
Tại sao nên dùng defer()
trong Laravel?
Bạn còn nhớ những route mà bạn từng viết – nơi cần gọi dữ liệu từ API rồi thực hiện một loạt hành động phía sau mà người dùng không quan tâm, nhưng vẫn phải chờ tất cả hoàn tất?
Vâng, tất cả chúng ta đều từng gặp ít nhất một lần. Laravel cũng sớm nhận ra điều này, và đó là lý do tại sao queue được ra đời để xử lý các trường hợp như vậy.
Nhưng việc tạo một queue chỉ để chạy một hàm đơn lẻ thì thật rườm rà, nhất là khi cách này còn yêu cầu cấu hình worker, class job, và thêm hạ tầng phức tạp
Cách hàm defer()
giải quyết vấn đề
Bất cứ khi nào bạn bọc một đoạn code trong hàm defer()
, Laravel sẽ thực thi đoạn code đó sau khi response đã được gửi đến trình duyệt của người dùng.
Điều này giúp người dùng có thể tiếp tục điều hướng trang web mà không phải chờ các đoạn code phức tạp và mất thời gian — những thứ họ không cần quan tâm — hoàn tất trước khi nhận được phản hồi.
Lợi ích nổi bật
Đơn giản hóa việc chạy tác vụ hậu xử lý – thay vì phải cấu hình queue/worker, bạn chỉ cần bọc code vào defer()
.
Tận dụng khả năng fastcgi_finish_request
của PHP-FPM: sau khi response đã gửi cho client, PHP vẫn có thể xử lý tiếp mã ở phía sau mà không giữ kết nối mở.
Cải thiện trải nghiệm người dùng – request trả về tức thì, các tác vụ nặng (gửi email, gọi API, ghi log, dọn file tạm…) thực thi ngầm.
Giảm “công sức” cho lập trình viên: không cần tạo class job, thiết lập queue driver hay vận hành worker riêng cho những công việc nhỏ, lẻ.
Nhờ đó, defer()
trở thành “lối tắt” lý tưởng để xử lý tác vụ không quan trọng tức thì, giúp code gọn gàng mà vẫn giữ hiệu năng cao.
5 Tình Huống Sử Dụng Thực Tiễn
1. Giao tiếp với API bên ngoài
Khi ứng dụng của bạn cần gửi dữ liệu đến một dịch vụ bên ngoài, chẳng hạn như nền tảng phân tích, ứng dụng có thể trì hoãn phản hồi (response). Sử dụng defer()
, bạn có thể chuyển giao task này.
Code ví dụ:
Route::post('/purchase', function () {
defer(function () {
Http::post('https://analytics.example.com/log', [
'event' => 'purchase',
'timestamp' => now(),
]);
});
return response()->json(['message' => 'Purchase successful!']);
});
Lợi ích: Người dùng sẽ thấy ngay xác nhận trong khi dữ liệu phân tích được xử lý ở chế độ nền.
2. Gửi email
Gửi email có thể là một hoạt động tốn thời gian, đặc biệt là nếu nó liên quan đến file đính kèm. Với defer()
, bạn có thể xử lý email sau khi phản hồi.
Code ví dụ:
Route::post('/register', function () {
defer(function () {
Mail::to('[email protected]')->send(new WelcomeEmail());
});
return response()->json(['message' => 'Welcome email is on its way!']);
});
Lợi ích: Người dùng không phải đợi email được gửi trước khi thấy thông báo đăng ký thành công.
3. Dọn file tạm sau khi tải về
Khi tạo các file tạm (temp files) để download hoặc xử lý, việc dọn dẹp chúng sau khi response sẽ đảm bảo server của bạn luôn sạch mà không ảnh hưởng đến trải nghiệm của người dùng.
Code ví dụ:
Route::get('/download', function () {
$filePath = 'temporary/report.pdf';
Storage::put($filePath, 'Generated report content');
defer(function () use ($filePath) {
Storage::delete($filePath);
});
return Storage::download($filePath);
});
Lợi ích: Người dùng tải xuống file của họ bình thường, trong khi server dọn dẹp các file tạm ở chế độ nền.
4. Xử lý Webhook
Phản hồi nhanh chóng với webhook từ các dịch vụ bên ngoài là rất quan trọng.
Code ví dụ:
Route::post('/webhook', function () {
defer(function () {
logger('Webhook processed.');
});
return response()->json(['status' => 'success']);
});
Lợi ích: Ứng dụng trả về response ngay, còn webhook được xử lý sau đó.
5. Tính toán phức tạp
Đối với các hoạt động sử dụng nhiều CPU, chẳng hạn như tạo báo cáo hoặc thực hiện tính toán, defer() cho phép bạn xử lý các hoạt động này ở chế độ nền.
Code ví dụ:
Route::get('/generate-report', function () {
defer(function () {
sleep(5);
logger('Report generation complete.');
});
return response()->json(['message' => 'Report generation started!']);
});
Lợi ích: Người dùng không gặp phải sự chậm trễ khi máy chủ hoàn thành các tác vụ tốn nhiều tài nguyên.
Kết luận
Hàm defer()
trong Laravel giúp:
Thao tác nền gọn nhẹ mà không cần cấu hình queue hoặc worker.
Giữ cho code gọn gàng, rõ ràng.
Cải thiện trải nghiệm người dùng bằng cách trả về nhanh chóng, chỉ xử lý các tác vụ không gấp rút phía sau.
Nếu bạn chưa dùng thử, hãy bắt đầu ngay hôm nay để cải thiện hiệu suất ứng dụng Laravel của mình!
Tham khảo


