Пять примеров использования defer() в Laravel

Источник: «5 Practical Use Cases for Laravel defer() Function»
Узнайте, как функция Laravel defer() может улучшить время отклика, выполняя фоновые задачи, такие как отправка электронной почты, очистка файлов и ведение логов после отправки ответа.

В современной веб-разработке скорость и отзывчивость — это главное. Медленная загрузка сайта или приложения может стать разницей между удовлетворением и разочарованием пользователей. Функция Laravel defer() — новое дополнение, призванное решить эту проблему, позволяя выполнять фоновые задачи без усилий, не влияя на время отклика.

В статье мы рассмотрим, почему defer() является фантастическим дополнением к Laravel, а также рассмотрим практические варианты её использования с примерами кода.

Зачем нужна функция defer() в Laravel

Традиционно разработчики полагались на очереди заданий или фоновые процессы для обработки задач, не требующих немедленного завершения. Несмотря на свою эффективность, эти подходы связаны с дополнительными расходами: настройкой очередей, конфигурированием классов заданий, управлением инфраструктурой и т. д.

Функция defer() упрощает этот процесс. Вот почему она замечательна:

Простота использования

Использовать defer() очень просто. Не нужно настраивать worker'ы или конфигурировать драйвера очередей. Просто оберните задачу в замыкание, и Laravel обеспечит её выполнение после отправки ответа.

use Illuminate\Support\Facades\Response;

Route::post('/process', function () {
defer(function () {
// Задача, которую нужно выполнить после ответа
logger('Deferred task executed.');
});

return Response::json(['message' => 'Task is being processed!']);
});

Централизованная фоновая функциональность

Вместо того чтобы разбрасывать фоновые задания по разным классам заданий или запускать события, defer() позволяет хранить связанную с отложенными заданиями логику в том же месте, что и основная логика обработки запросов. Это улучшает читабельность и сопровождаемость кода.

Улучшение пользовательского опыта

Поскольку задачи выполняются после отправки ответа, пользователь получает более высокую скорость работы, в то время как сервер продолжает выполнять несрочные операции в фоновом режиме.

Примеры использования функции defer()

Рассмотрим несколько сценариев, использующих функцию defer() в реальных условиях.

Коммуникации со сторонними API

Когда приложению необходимо отправить данные во внешний сервис, например, аналитическую платформу, это может привести к задержке ответа. Используя функцию defer(), можно разгрузить эту задачу.

use Illuminate\Support\Facades\Http;

Route::post('/purchase', function () {
defer(function () {
Http::post('https://analytics.example.com/log', [
'event' => 'purchase',
'timestamp' => now(),
]);
});

return response()->json(['message' => 'Purchase successful!']);
});

Рассылка сообщений электронной почты

Рассылка электронных писем может занимать много времени, особенно если они содержат вложения. С помощью функции defer() можно обрабатывать электронные письма после ответа.

use Illuminate\Support\Facades\Mail;

Route::post('/register', function () {
defer(function () {
Mail::to('user@example.com')->send(new WelcomeEmail());
});

return response()->json(['message' => 'Welcome email is on its way!']);
});

Очистка временных файлов после скачивания

При создании временных файлов для загрузки или обработки, их очистка после ответа обеспечивает чистоту сервера, не оказывая влияния на работу пользователей.

use Illuminate\Support\Facades\Storage;

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);
});

Обработка вебхуков

Быстрое реагирование на вебхуки от внешних сервисов очень важно. С помощью функции defer() можно отправить ответ с подтверждением, а затем обработать полезную нагрузку.

Route::post('/webhook', function () {
defer(function () {
// Обработка полезной нагрузки вебхука
logger('Webhook processed.');
});

return response()->json(['status' => 'success']);
});

Сложные вычисления

Для операций, требующих значительных ресурсов процессора, таких как генерация отчётов или выполнение вычислений, функция defer() позволяет обрабатывать их в фоновом режиме.

Route::get('/generate-report', function () {
defer(function () {
// Имитация сложных вычислений
sleep(5);
logger('Report generation complete.');
});

return response()->json(['message' => 'Report generation started!']);
});

Заключение

Функция Laravel defer() вносит необходимое улучшение в обработку фоновых задач. Она проста в использовании, хранит логику отложенных задач в одном месте и обеспечивает лучший пользовательский опыт за счёт выполнения несрочных задач после ответа сервера.

Если ещё не пробовали, то самое время включить её в свои проекты!

Комментарии


Дополнительные материалы

Предыдущая Статья

Что означает ошибка "refusing to merge unrelated histories"

Следующая Статья

ES2025: Атрибуты импорта JavaScript