Простой способ сэкономить память отдаче данных в Symfony.
Пример контроллера если у нас есть поток (например, тип bytea из postgres).
public function downloadAction()
{
$data = \fopen('path_to_file.zip', 'r');
$response = new StreamedResponse();
$response->setCallback(function () use ($data) {
\stream_copy_to_stream($data, \fopen('php://output', 'w'));
});
$contentDisposition = $response->headers->makeDisposition(\Symfony\Component\HttpFoundation\ResponseHeaderBag::DISPOSITION_ATTACHMENT, 'myfile.zip');
$response->headers->set('Content-Type', 'application/zip');
$response->headers->set('Content-Disposition', $contentDisposition);
return $response;
}
Пример контроллера если у нас есть файл.
public function downloadAction()
{
$response = new StreamedResponse();
$response->setCallback(function () {
\readfile('path_to_file.zip');
});
$contentDisposition = $response->headers->makeDisposition(\Symfony\Component\HttpFoundation\ResponseHeaderBag::DISPOSITION_ATTACHMENT, 'myfile.zip');
$response->headers->set('Content-Type', 'application/zip');
$response->headers->set('Content-Disposition', $contentDisposition);
return $response;
}