Как частично отдавать файл на скачивание?
Есть большой набор данных в БД. PHP скрипт запрашивает по 1000 строк, где происходят сложные операции. Мне надо после запроса этих 1000 строк записать их в CSV файл и сразу отдать пользователю на скачивание, чтобы на засорять память. Как реализовать такой подход?
З.Ы. Суть в том, что файл CSV может быть огромный, а на сервер нет места для его полного хранения. Или я что-то не так понимаю? Идея: взять 1000 записей, записать их в php://output и сразу отдавать на скачивание, процедуру повторить.
Сейчас реализация выглядит так:
if ($clearBuffers) {
while (ob_get_level() > 0) {
ob_end_clean();
}
} else {
ob_end_clean();
}
$filename = $this->_settings['filename'] . '.' . self::EXPORT_EXTENSION;
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private", false);
header('Content-Type: application/octet-stream');
header("Content-Disposition: attachment; filename=\"{$filename}\"\r\n");
header('Content-Transfer-Encoding: binary');
ob_start();
$this->_csv = fopen('php://output', 'wb');
$offset = 0;
while ($queryResult = method_exists($this->dataProvider->query, 'asArray') ? $this->dataProvider->query->limit($this->_settings['limit'])->offset($offset)->asArray()->all() : $this->dataProvider->query->limit($this->_settings['limit'])->offset($offset)->all()) {
$this->writeContentRows($queryResult);
$offset += $this->_settings['limit'];
unset($queryResult);
gc_collect_cycles();
ob_flush();
flush();
}
В методе writeContentRows как раз происходит fputcsv.
Реализация по идеи и вопросу корректная или нет?