Вопрос проверяет понимание архитектуры загрузки больших файлов, работы с потоками, очередями и асинхронной обработкой.
Для обработки крупных Excel-файлов нужно вынести все тяжёлые операции в фоновые процессы. Файл загружается через backend, сохраняется в хранилище, пользователь сразу получает ответ, а сама обработка запускается асинхронно через очередь. Для предотвращения превышения памяти используется потоковое чтение файла (chunking) и построчная обработка. Интерфейс опрашивает API о статусе обработки, чтобы не блокировать пользователя.
Работа с файлами 100–300 МБ требует особого подхода, чтобы не падать по памяти и не блокировать UI.
Файл отправляется на backend через обычный POST.
Цель — вернуть ответ мгновенно, чтобы UI не завис.
Поэтому:
файл записывается во временное хранилище (диск, S3, MinIO)
создаётся запись в БД о задаче импорта
формируется job в очередь (RabbitMQ, Redis, SQS)
Backend возвращает:
{ taskId: "...", status: "queued" }
Пользователь видит, что импорт принят.
Обработка выполняется worker-ами в очереди.
никакой загрузки всего файла в память
строгая потоковая обработка
Используются:
PhpSpreadsheet (stream mode)
или Spout (более лёгкая библиотека)
или готовый стриминг-парсер XLSX (zip+xml events)
Большой файл нужно читать:
построчно
маленькими порциями (batch)
оптимальным объёмом, например 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);
В БД хранится состояние:
queued
processing
partial_progress (например, “30%”)
finished
errored
Worker периодически обновляет статус.
Frontend регулярно делает polling:
js
fetch('/api/import/status?task=...')
или WebSocket/Server-Sent Events.
Пользователь:
загрузил файл
получил taskId
может закрыть страницу
может смотреть прогресс позже
Ни один этап обработки не зависит от браузера.
Варианты:
локальный диск (если есть shared volumes)
S3 / MinIO
NFS-сеть
временная директория в Docker volume
ограничение размера (ниже 500 МБ)
проверка формата
проверка количества строк (если доступно)
отдельные очереди для больших импортов
Чтобы обрабатывать Excel-файлы по 300 МБ:
загрузка и обработка выполняются асинхронно
используется построчное / потоковое чтение
данные обрабатываются батчами
интерфейс периодически получает прогресс
worker работает независимо от UI