Лучший способ - использовать системный вызов sendfile
.Если вы открываете и считываете файл с диска вручную, а затем снова записываете его по блокам в конец «приемника» вашей веб-инфраструктуры, то вы очень расточительны, потому что данные должны проходить через ОЗУ, возможно, включая буферизацию.
То, что вы описываете в своем вопросе, является очень распространенным паттерном, поэтому уже существует множество решений, основанных на идее простого задания специального HTTP-заголовка , а затем позволяющего веб-стеку ниже вашего приложения справляться с ним.эффективно.
Используйте промежуточное программное обеспечение XSendfile в Plack, чтобы установить соответствующий заголовок.Следующая минимальная программа будет использовать DTRT и по возможности использовать системный вызов.
use IO::File::WithPath qw();
use Plack::Builder qw(builder enable);
builder {
enable 'Plack::Middleware::XSendfile';
sub {
return [200, [], IO::File::WithPath->new('/usr/src/linux/COPYING')];
}
};