Обработка больших файлов с помощью Flysystem

Я использую Flysystem в приложении Symfony для управления загрузкой / скачиванием файлов на S3.

$downloadableFileStream = $this->get("filesystem")->readStream($document->getDocument()),
$mimeType = $this->get("filesystem")->getMimetype($document->getDocument()),
$filename =$document->getDocument()

if (ob_get_level()) ob_end_clean();
return new StreamedResponse(function () use ($downloadableFileStream, $mimeType, $filename) {
    fpassthru($downloadableFileStream);
}, 200, [
    'Content-Transfer-Encoding', 'binary',
    'Content-Type' => "application/octet-stream",
    'Content-Disposition' => ('attachment; filename = "' . $filename . '"'),
    'Content-Length' => fstat($downloadableFileStream)['size'],
]);

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

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

Есть ли способ "начать" загрузку не получить весь файл?

Какие-либо предложения ?

Спасибо :)

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
624
1

Ответы 1

попробуйте добавить flush(); после fpassthru($downloadableFileStream);

так это будет выглядеть

fpassthru($downloadableFileStream);
flush();

Также вам не нужны $mimeType и $filename в использовании

То же самое, для файла 3mo, новая страница открывается, подождите 5 секунд, и файл сразу становится доступным. мне нужно начать загрузку, например, если я использую прямой URL-адрес (но я не могу, потому что этот сегмент является частным)

Benjamin B. 21.05.2018 13:40

@BenjaminB. как насчет веб-сервера? может быть, это еще и буферизация вывода?

Denis Alimov 21.05.2018 13:55

я не понимаю о чем ты

Benjamin B. 21.05.2018 14:00

Я имею в виду, что PHP может работать нормально, но веб-сервер также буферизует putput (nginx или apache, что бы вы ни использовали)

Denis Alimov 21.05.2018 14:14

я отключил nginx proxy_buffering off; и это то же самое :)

Benjamin B. 21.05.2018 14:26

Я исправил проблему временно, получив файл с прямого защищенного частного URL-адреса S3. возможно то, что я хочу сделать, невозможно

Benjamin B. 21.05.2018 14:29

Другие вопросы по теме