Как частично отдавать файл на скачивание?

Есть большой набор данных в БД. 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.

Реализация по идеи и вопросу корректная или нет?


Ответы (0 шт):