Я работаю в разделе модуля Perl, который создает большой ответ CSV. Сервер работает на Plack, на котором я далек от эксперта.Отправка небуферизованного ответа в Plack
В настоящее время я использую что-то вроде этого, чтобы отправить ответ:
$res->content_type('text/csv');
my $body = '';
query_data (
parameters => \%query_parameters,
callback => sub {
my $row_object = shift;
$body .= $row_object->to_csv;
},
);
$res->body($body);
return $res->finalize;
Однако, что query_data
функция не быстрый один и получает много записей. Там я просто объединяю каждую строку в $body
и после того, как все строки обработаны, отправив весь ответ.
Мне не нравится это по двум очевидным причинам: во-первых, требуется много оперативной памяти, пока не будет уничтожен $body
. Во-вторых, пользователь не видит активности ответа до тех пор, пока этот метод не завершит работу и фактически отправит ответ с $res->body($body)
.
Я попытался найти ответ на этот вопрос in the documentation, не найдя, что мне нужно.
Я также попытался позвонить $res->body($row_object->to_csv)
в мой раздел обратного вызова, но похоже, что это заканчивается тем, что отправляет только последний звонок, который я сделал для $res->body
, переопределяя все предыдущие.
Есть ли способ отправить ответ Plack, который очищает содержимое в каждой строке, чтобы пользователь начал получать контент в реальном времени по мере сбора данных и без необходимости накапливать все данные в первую очередь?
Заранее благодарим за любые комментарии!
Я не пробовал это, но вы должны иметь возможность использовать объект с методом 'getline'. Для более подробной информации отправьте короткий, но полный пример. –
Спасибо Синан. Да, то, что вы упоминаете, правильно, я попробовал простой объект, реализующий 'getline', и он работал нормально, за исключением того факта, что Plack все еще буферизует ответ и не отправляет ничего в браузер до тех пор, пока' -> getline' не будет определен , Что касается моего примера, я изменил его, чтобы сделать его немного более понятным. Единственное реальное отличие, отправляя мой реальный код, - это много не связанных строк, добавленных в микс. Единственное, что я пытаюсь выяснить, - это сделать, чтобы Plack отправил небуферизованный ответ. –
В коде отсутствует функция 'get_data'. Я думаю, вы имеете в виду 'query_data'. – simbabque