Добрый день. Мне интересно, могу ли я использовать chunked Transfer Encoding (далее CTE) в ответе API? У меня есть большие данные в базе данных, и мне нужно передать их клиенту в одном запросе. Я много читал о механизме CTE, но, к сожалению, не смог найти, как это реализовать.
Одна важная вещь для упоминания: нет нумерации страниц. Предполагается, что это автономная система, которая возвращает данные обратно в конечную точку клиента, а не на веб-страницу.
Как я уже говорил, данные хранятся в базе данных. Единственная проблема состоит в том, как разделить данные на сегменты (порции) и отправить их в одном ответе API (один за другим).
Благодарю.
Я думаю, что вас может заинтересовать метод чанков в Query Builder.
Если вам нужно работать с тысячами записей базы данных, рассмотрите возможность использования
метод чанка. Этот метод извлекает небольшую часть результатов
за раз и подает каждый кусок в замыкание для обработки. это
Метод очень полезен для написания команд Artisan, которые обрабатывают
тысячи записей. Например, давайте работать со всеми пользователями
таблица по 100 записей за раз:
$response = new \Symfony\Component\HttpFoundation\StreamedResponse(function() {
$handle = fopen('php://output', 'w');
DB::table('users')->orderBy('id')->chunk(100, function ($users) use($handle) {
foreach ($users as $user) {
fputs($handle, json_encode($user));
}
});
fclose($handle);
});
return $response;
Дальнейшее чтение: https://laravel.com/docs/master/queries#chunking-results
Насколько я знаю, Laravel делает это по умолчанию если вы возвращаете ответ JSON.
Мое решение было излишне запутанным и сложным. Я удалил StreamedResponse
так как в этом действительно не было никакой необходимости. Смотрите обновленный пример ниже.
$json_response = collect();
DB::table('users')->orderBy('id')->chunk(100, function ($users) use($json_response) {
foreach ($users as $user) {
$json_response->push($user);
}
});
return $json_response->toJson();
Других решений пока нет …