Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Laravel: asynchronous, synchronous, queues

Очереди: что выносить, а что нет? Когда задача обязана быть синхронной?

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

Короткий ответ

В очереди стоит выносить задачи, которые выполняются долго или могут быть отложены: отправка email, обработка изображений, интеграция с внешними API. Не стоит выносить критические операции, влияющие на immediate пользовательский опыт. Задачи обязаны быть синхронными когда требуется мгновенная обратная связь или когда последующие операции зависят от результата выполнения.

Длинный ответ

Очереди в Laravel позволяют откладывать обработку трудоемких задач, улучшая отзывчивость приложения. Однако не все задачи подходят для асинхронного выполнения.

Что выносить в очереди

Долгие операции

  • Обработка и ресайз изображений

  • Генерация отчетов и документов

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

class ProcessUploadedImage implements ShouldQueue {
    public function handle() {
        // Ресайз изображения - может занять много времени
        Image::load($this->imagePath)
             ->resize(800, 600)
             ->save();
    }
}

// Использование в контроллере
public function uploadImage(Request $request) {
    $path = $request->file('image')->store('uploads');
    ProcessUploadedImage::dispatch($path); // Асинхронно
    return response()->json(['status' => 'processing']);
}

Внешние интеграции

  • Отправка email и SMS

  • Вызовы внешних API

  • Синхронизация данных с другими системами

class SendWelcomeEmail implements ShouldQueue {
    public function handle() {
        Mail::to($this->user->email)
            ->send(new WelcomeEmail($this->user));
    }
}

Периодические задачи

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

  • Агрегация статистики

  • Рассылка уведомлений

Что не выносить в очереди

Критические операции

  • Списание денег с баланса

  • Создание заказов

  • Изменение важных данных

Задачи, требующие immediate обратной связи

  • Поиск по каталогу товаров

  • Проверка доступности

  • Валидация форм

Когда задача обязана быть синхронной

Зависимые операции

Когда последующие действия зависят от результата задачи:

public function registerUser(array $data) {
    // Создание пользователя должно быть синхронным
    $user = User::create($data);
    
    // Отправка email может быть асинхронной
    SendWelcomeEmail::dispatch($user);
    
    // Авторизация пользователя должна быть синхронной
    auth()->login($user);
    
    return $user;
}

Транзакционные операции

Когда несколько действий должны быть выполнены атомарно:

public function transferMoney($fromAccount, $toAccount, $amount) {
    return DB::transaction(function () use ($fromAccount, $toAccount, $amount) {
        // Эти операции должны быть синхронными и в транзакции
        $fromAccount->decrement('balance', $amount);
        $toAccount->increment('balance', $amount);
        
        // Создание лога может быть асинхронным
        LogTransaction::dispatch($fromAccount, $toAccount, $amount);
        
        return true;
    });
}

Real-time взаимодействие

  • WebSocket события

  • Instant уведомления

  • Online чаты

Смешанный подход

Иногда полезно комбинировать синхронное и асинхронное выполнение:

public function placeOrder(OrderRequest $request) {
    return DB::transaction(function () use ($request) {
        // Синхронно: критически важные операции
        $order = Order::create($request->validated());
        $this->inventoryService->reserveItems($order);
        
        // Асинхронно: не критические задачи
        SendOrderConfirmation::dispatch($order);
        UpdateAnalytics::dispatch($order);
        ProcessRecommendations::dispatch($order);
        
        return $order;
    });
}

Вывод

Выносите в очереди задачи, которые могут быть выполнены позже без ущерба для пользовательского опыта. Оставляйте синхронными критические операции и задачи, требующие immediate обратной связи. Правильное распределение улучшает производительность и пользовательский опыт.

  • Аватар

    PHP Guru

    Mikhail Savin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • Laravel

    Laravel

Ключевые слова

#asynchronous

#synchronous

#queues

Подпишись на PHP Developer в телеграм

  • Аватар

    PHP Guru

    Mikhail Savin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.