Возможность потоковой передачи сжатого потока данных с помощью Perl - PullRequest
2 голосов
/ 09 августа 2011

Я пытаюсь отправить сжатый архив из сценария Perl CGI. Все работает нормально, за исключением того, что тарбол отправляется только после того, как он был сжат и создан. Другими словами, это не «потоковая передача» данных в реальном времени, что довольно проблематично, поскольку данные достаточно велики.

print "Content-Type:application/x-download\n"; 
print "Content-Disposition:attachment;filename=download.tar.\n\n";
print `tar zc $path/$file`

Я также попытался сделать tar zcf - $path/$file, который пишет в стандартный вывод, и он делает то же самое.

Ответы [ 2 ]

2 голосов
/ 09 августа 2011

Как указал Гео, вы ждете, пока tar закончится.Чтение из канала также должно выводить данные параллельно с его созданием:

open my $pipe_fh, '-|', "tar zc $path/$file" or die;
while(<$pipe_fh>) {
    print;
}
1 голос
/ 09 августа 2011

Ну, в случае с обратными метками вы практически ждете завершения процесса, а затем отправляете его вывод.Я бы предложил что-то из семьи IPC::Open. IPC :: Open3 может добиться цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...