Как я могу использовать кодирование передачи chunked в Laravel? - PullRequest
0 голосов
/ 12 февраля 2019

Добрый день.Мне интересно, могу ли я использовать chunked Transfer Encoding (далее CTE) в ответе API?У меня есть большие данные в базе данных, и мне нужно передать их клиенту в одном запросе.Я много читал о механизме CTE, но, к сожалению, не смог найти, как это реализовать.

Одна важная вещь, которую стоит упомянуть: нет нумерации страниц.Предполагается, что это автономная система, которая возвращает данные обратно в конечную точку клиента, а не на веб-страницу.

Как я уже говорил, данные хранятся в базе данных.Единственная проблема заключается в том, как разбить данные на сегменты (порции) и отправить их в одном ответе API (один за другим).

Спасибо.

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

В моем конкретном случае я решил свою проблему с помощью этого кода (пример):

use Symfony\Component\HttpFoundation\StreamedResponse;

$response = new StreamedResponse();
$response->setCallback(function () {
    var_dump('Hello World');
    flush();
    sleep(2);
    var_dump('Hello World');
    flush();
});
$response->send();
0 голосов
/ 12 февраля 2019

Думаю, вас может заинтересовать метод чанков в 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();
...