Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

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

Как спроектировать веб-решение, позволяющее загружать и обрабатывать большие Excel-файлы объёмом до 300 МБ без блокировки интерфейса?

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

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

Для обработки крупных Excel-файлов нужно вынести все тяжёлые операции в фоновые процессы. Файл загружается через backend, сохраняется в хранилище, пользователь сразу получает ответ, а сама обработка запускается асинхронно через очередь. Для предотвращения превышения памяти используется потоковое чтение файла (chunking) и построчная обработка. Интерфейс опрашивает API о статусе обработки, чтобы не блокировать пользователя.

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

Проектирование обработки больших Excel-файлов

Работа с файлами 100–300 МБ требует особого подхода, чтобы не падать по памяти и не блокировать UI.

1. Архитектура загрузки

1. Пользователь загружает файл

Файл отправляется на backend через обычный POST.

2. Backend НЕ обрабатывает его сразу

Цель — вернуть ответ мгновенно, чтобы UI не завис.

Поэтому:

  • файл записывается во временное хранилище (диск, S3, MinIO)

  • создаётся запись в БД о задаче импорта

  • формируется job в очередь (RabbitMQ, Redis, SQS)

Backend возвращает:

{ taskId: "...", status: "queued" }

Пользователь видит, что импорт принят.


2. Фоновая обработка файла

Обработка выполняется worker-ами в очереди.

Требования:

  • никакой загрузки всего файла в память

  • строгая потоковая обработка

Используются:

  • PhpSpreadsheet (stream mode)

  • или Spout (более лёгкая библиотека)

  • или готовый стриминг-парсер XLSX (zip+xml events)


3. Потоковое чтение (streaming) и батчи

Большой файл нужно читать:

  1. построчно

  2. маленькими порциями (batch)

  3. оптимальным объёмом, например 500–2000 строк за раз

Каждый батч обрабатывается:

  • в отдельной транзакции

  • с контролем потребления памяти

  • с частичным коммитом результатов

Псевдокод:

php

$reader = new XLSXStreamingReader($filepath);

foreach ($reader->getRows() as $row) {
    $batch[] = $row;

    if (count($batch) >= 1000) {
        processBatch($batch);
        $batch = [];
    }
}

if (!empty($batch)) processBatch($batch);

4. Обновление статуса задачи

В БД хранится состояние:

  • queued

  • processing

  • partial_progress (например, “30%”)

  • finished

  • errored

Worker периодически обновляет статус.

Frontend регулярно делает polling:

js

fetch('/api/import/status?task=...')

или WebSocket/Server-Sent Events.


5. Не блокировать интерфейс

Пользователь:

  • загрузил файл

  • получил taskId

  • может закрыть страницу

  • может смотреть прогресс позже

Ни один этап обработки не зависит от браузера.


6. Где хранить файл

Варианты:

  • локальный диск (если есть shared volumes)

  • S3 / MinIO

  • NFS-сеть

  • временная директория в Docker volume


7. Защита от больших файлов

  • ограничение размера (ниже 500 МБ)

  • проверка формата

  • проверка количества строк (если доступно)

  • отдельные очереди для больших импортов


8. Вывод

Чтобы обрабатывать Excel-файлы по 300 МБ:

  • загрузка и обработка выполняются асинхронно

  • используется построчное / потоковое чтение

  • данные обрабатываются батчами

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

  • worker работает независимо от UI

  • Аватар

    PHP Guru

    Mikhail Savin

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

Уровень

  • Рейтинг:

    3

  • Сложность:

    8

Навыки

  • PHP

    PHP

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

#async

#processing

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

  • Аватар

    PHP Guru

    Mikhail Savin

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