@bighoc
php/javascript developer

Как отдать файл на лету?

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

Прямо сейчас это работает так:
Данные собираються в одном большом массиве, потом массив перегоняется в csv файл который лежит на сервере, клиенту читаеться этот файл, файл удаляеться.
время которое тратиться: 7 секунд
память выделеная для пхп: 11мб

Пробовал сделать через "php://temp":
Без массива посредине, сразу кладу данные в формате csv в temp, когда все данные сформированны достаю и отдаю юзеру.
время: 3 секунды,
память: 114мб

Изначально вместо php://temp планировалось сделать через php://stdout, но почему то неполучаеться. Возможно ктото сталкивался с подобным ? Могу я начать отдавать юзеру файл ещё до того как я сгенерил все необходимые данные ?
  • Вопрос задан
  • 2003 просмотра
Пригласить эксперта
Ответы на вопрос 3
stasuss
@stasuss
быдлокодер со стажем
ну csv это текст посути. его можно выводить прямо в буфер напрямую, только перед этим выставить хедеры, что бы браузер понял что ему пихают файл csv, а не html
Ответ написан
Лучше сразу направлять данные пользователю.
header('Content-Description: File Transfer');
header("Cache-Control: public");
header('Content-Disposition: attachement;filename="test.csv";');
header('Content-Type: application/csv; charset=UTF-8');
$output = fopen('php://output', 'w');
...
fputcsv( $output, $item,';' );
Ответ написан
Комментировать
Marcuzy
@Marcuzy
php разработчик
$f = fopen('file.xlsx', 'r');
Yii::$app->response->sendStreamAsFile($f, 'file.xlsx', ['mimeType'=>'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы