Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про PHP: async, job

Как реализовать асинхронную обработку загруженных файлов на бэкенде так, чтобы пользователь мог продолжать работу во время импорта?

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

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

Асинхронный импорт строится вокруг очереди (RabbitMQ/Redis) и фоновых воркеров. После загрузки файл сохраняют, создают задачу импорта в БД и отправляют job в очередь. Воркеры обрабатывают файл в фоне, обновляют статус задачи и пишут прогресс. Пользователь получает taskId и периодически запрашивает статус. Это позволяет интерфейсу не блокироваться и продолжать работу.

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

Архитектура асинхронного импорта файлов

Для асинхронной обработки необходимо разделить:

  1. загрузку файла

  2. постановку задачи

  3. выполнение тяжёлой обработки


1. Этап 1: загрузка файла

Backend:

  • принимает файл

  • сохраняет его в постоянное хранилище

  • создаёт запись в таблице imports:

id, filename, status='queued', progress=0
  • отправляет taskId клиенту

Пользователь получает мгновенный ответ и продолжает работать.


2. Этап 2: постановка задачи (job creation)

Worker-очередь получает job:

{ taskId: 123, filepath: "/uploads/x.xlsx" }

Очередь — RabbitMQ, Redis, SQS.


3. Этап 3: фоновая обработка

Воркер:

  1. меняет статус → processing

  2. открывает файл потоковым reader-ом

  3. обрабатывает батчами

  4. после каждого батча обновляет прогресс:

UPDATE imports SET progress = 37 WHERE id = 123;
  1. после завершения → статус finished

  2. при ошибке → errored


4. Этап 4: пользователь узнаёт прогресс

UI выполняет polling:

js

setInterval(() => {
    fetch("/api/import/status?id=123")
      .then(showProgress)
}, 2000)

Или WebSocket/SSE для push-уведомлений.


5. Этап 5: завершение

Когда прогресс = 100%, интерфейс уведомляет пользователя.


6. Особенности реализации

1. Worker должен уметь отправлять логи/ошибки

Чтобы UI мог показать ошибку.

2. Важно избегать загрузки файла в память

Использовать streaming.

3. Progress хранится в БД или Redis

Выбирается по нагрузке.

4. Повторяемость задач

Если воркер упал — очередь переназначит job другому воркеру.

5. Защита от повторной обработки

Использовать status + idempotency.


7. Вывод

Асинхронная обработка достигается комбинацией:

  • очереди задач

  • фоновых воркеров

  • потокового чтения файла

  • статуса прогресса

  • периодического опроса интерфейса

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

  • Аватар

    PHP Guru

    Mikhail Savin

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

Уровень

  • Рейтинг:

    5

  • Сложность:

    7

Навыки

  • PHP

    PHP

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

#async

#job

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

  • Аватар

    PHP Guru

    Mikhail Savin

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