Всем приветApache, на нём Perl-скрипт, который читает файл и выдаёт его в браузер:
open(my $F, '<', "/Folder/logs/error.log") or die $!;
binmode($F);
{
local $/;
my $Result = <$F>;
}
close($F);print "Content-type: application/txt; charset=UTF-8\n";
print "Content-Disposition: attachment; filename="error.log\n\n";
print $Result;
Иногда лог просто гигантский и его необходимо зазиповать перед выдачей.1. Как сделать это красиво "в воздухе", без пересохранения файла при зиповании?
2. Как зазиповать несколько файлов, тем же способом, т.е. манипулируя только лишь переменными?
Заранее спасибо!
>[оверквотинг удален]
> open(my $F, '<', "/Folder/logs/error.log") or die $!;
> binmode($F);
> {
> local $/;
> my $Result = <$F>;
> }
> close($F);
> print "Content-type: application/txt; charset=UTF-8\n";
> print "Content-Disposition: attachment; filename="error.log\n\n";
> print $Result;Бессмысленный скрипт. Веб сервер умеет отдавать статичный контент сам. для этого скрипт не нужен.
> Иногда лог просто гигантский и его необходимо зазиповать перед выдачей.
Веб сервер как правило имеет соответствующую опцию по сжатию отдаваемого налету.
сжатие веб сервером при этом и распаковка браузером происходят прозрачно для пользователя...> 1. Как сделать это красиво "в воздухе", без пересохранения файла при зиповании?
организуйте конвеер через шелл-скрипт. примеров в инете как грязи.
> 2. Как зазиповать несколько файлов, тем же способом, т.е. манипулируя только лишь
> переменными?используйте в вышеупомянутом конвеере маску.
> Заранее спасибо!
Статичный для примера, в реальности лог дёргается по сетевому пути и подсовывание "прямой" (если так можно выразиться) ссылки невозможно для пользователя.Не понял, как сделать зип из нескольких файлов по конвееру? Там же в зипе имена как-то должны быть указаны
> Не понял, как сделать зип из нескольких файлов по конвееру? Там же
> в зипе имена как-то должны быть указаныАга, указаны. В конце файла.
ZIP - самый неудобный формат для [больших] потоков.Используй gzip, жми файлы по-одиночке. Если уж совсем неймётся - смотри на tar.gz.
И будет тебе счастье.
> Статичный для примера, в реальности лог дёргается по сетевому пути и подсовывание
> "прямой" (если так можно выразиться) ссылки невозможно для пользователя.у вас там какое-то корпоративное табу на монтирование сетевых ресурсов?
> Статичный для примера, в реальности лог дёргается по сетевому пути и подсовывание
> "прямой" (если так можно выразиться) ссылки невозможно для пользователя.Вам для начала надо ознакомится с матчастью. А "по наитию" вы так и продолжите лепить горбатого.
Статичный это не то что вы представляете. Статичный контент - это файл на диске или где-то еще, существующий постоянно, в отличие от динамического контента - генерируемого "на лету" скриптами. Динамический контент нигде не существует постоянно, он генерируется, а статичный- существует постоянно, его можно в любой момент прочитать как файл. Тоесть елси до начала вызова скрипта, файл который вы собрались отдавать пользователю уже где-то существовал - то это статичный контент, а если он нигде не существовал- то динамический.
Судя по вашему скрипту- вы тупо перекачиваете статичный контент, нагружая сервер совершенно бессмысленнйо работой ради работы. Ну или потому что архитектурное решение использованное вами- продиктовано незнанием и профневежеством.И так, ваши файлы - это все таки статичный контент, вне зависимости от того где в сети они находятся. на шаре удаленной, на каком-то сервере или гдето еще.
И такие файлы веб- сервер умеет сжимать сам на лету при передаче. и отдавать сам без скриптов...> Не понял, как сделать зип из нескольких файлов по конвееру? Там же
> в зипе имена как-то должны быть указаныУчите матчасть! Ну или.. чтение документации в слух - 300$ в час. "С выражением" - 700$ в час.
При такой постановке вопроса вам не откажут в небольшом образовательном экскурсе в технологии которые вы походу решили шапками закидать...
>[оверквотинг удален]
> }
> close($F);
> print "Content-type: application/txt; charset=UTF-8\n";
> print "Content-Disposition: attachment; filename="error.log\n\n";
> print $Result;
> Иногда лог просто гигантский и его необходимо зазиповать перед выдачей.
> 1. Как сделать это красиво "в воздухе", без пересохранения файла при зиповании?
> 2. Как зазиповать несколько файлов, тем же способом, т.е. манипулируя только лишь
> переменными?
> Заранее спасибо!1) Не использавать binmode для текстовых файлов.
2) Читать файл readline вместо my $Result = <$F>;
3) почемубы вместо всего это идиотизма просто не отдавать файл целиком по ссылке, вывалив каталог логов в апаче с включенным индексированием, ибо он целиком отдается и прогонять его целиком через скрипт маразм.
> 3) почемубы вместо всего это идиотизма просто не отдавать файл целиком по
> ссылке, вывалив каталог логов в апаче с включенным индексированием, ибо он
> целиком отдается и прогонять его целиком через скрипт маразм.А ещё включить gzip на лету в том же апаче. Вообще ничего писать не нужно.
> А ещё включить gzip на лету в том же апаче. Вообще ничего
> писать не нужно.Афтар на своей волне походу - через опу но по своему.
http://yaforyou.ru/?q=perl%20create%20zip%20a...по первой же ссылке
https://www.perlmonks.org/?node_id=929668
use IO::Compress::Zip qw(:all);my @files = ('error.log', 'access.log', 'ssl_request.log');
my $path = "/var/log/apache22";
print "Content-Type:application/zip\n";
print "Content-Disposition: attachment; filename=\"filename.zip\"\n\n";my $z;
foreach my $file (@files) {
if ($z) {
$z->newStream(Name => $file, Method => ZIP_CM_STORE);
} else {
$z = new IO::Compress::Zip "-", Name => $file, Method => ZIP_CM_STORE;
}open(FILE, "<", "$path/$file");
binmode FILE;my ($buf, $data, $n);
while (($n = read FILE,$data, 1024) != 0) {
$z->print($data);
}close(FILE);
}$z->close;
exit;
всё уже изобретено до нас и для нас
Спасибо!