Thread View: pl.comp.lang.perl
3 messages
3 total messages
Started by Marcin Gryszkalis
Fri, 08 Jan 2010 13:15
File::Copy syswrite binmode utf8 i nie wiadomo co
Author: Marcin Gryszkalis
Date: Fri, 08 Jan 2010 13:15
Date: Fri, 08 Jan 2010 13:15
50 lines
2229 bytes
2229 bytes
Witam
Trochę mnie wczoraj zaskoczyła jedna rzecz, mianowicie w jednej aplikacji
CGI musiałem wyrzucić do przeglądarki plik, ale ponieważ plik potencjalnie
mógł być dość duży zamiast
print(read_file($path)); # read_file z File::Slurp
chciałem napisać
copy($path, \*STDOUT); # copy z File::Copy
bo copy kopiuje po kawałku więc nie zje mi pamięci.
Niestety efekt był taki, że funkcja copy się zapętlała wysyłając plik w
kółko od początku, jednocześnie dostałem następujący warning:
Argument "\x{5c63}" isn't numeric in addition (+) at
/usr/local/lib/perl5/5.10.1/File/Copy.pm line 203.
198 for (;;) {
199 my ($r, $w, $t);
200 defined($r = sysread($from_h, $buf, $size))
201 or goto fail_inner;
202 last unless $r;
203 for ($w = 0; $w < $r; $w += $t) {
204 $t = syswrite($to_h, $buf, $r - $w, $w)
205 or goto fail_inner;
206 }
207 }
chodzi o dodawnie $w += $t, gdzie $t jest wielkością zwróconą z syswrite, co
istotne
0x5c63 to jest wielkość pliku, na którym testowałem, więc zakładam, że
syswrite zapsało tyle właśnie bajtów - tylko dlaczego zostało to
zinterpretowane jako \x{5c63}?
jawne binmode(STDOUT) nic nie zmieniło (zresztą File::Copy samo też robi
binmode dla handle-ów).
Skąd takie zachowanie?
pozdrawiam
--
Marcin Gryszkalis, PGP 0x9F183FA3
jabber jid:mg@fork.pl, gg:2532994
http://the.fork.pl
Re: File::Copy syswrite binmode utf8 i nie wiadomo co
Author: Adam Osuchowski
Date: Sun, 10 Jan 2010 17:56
Date: Sun, 10 Jan 2010 17:56
19 lines
1632 bytes
1632 bytes
Marcin Gryszkalis wrote: > Skąd takie zachowanie? Próbowałeś wyizolować problem? Tzn. puścić np. z palca: $ perl -MFile::Copy -e 'copy "plik", \*STDOUT' > /dev/null na tym samym pliku i zobaczyć czy pokazuje ten sam warning. A potem, prosty skrypt CGI, który woła tylko copy() i nic więcej. U mnie na wersjach 5.8.8 i 5.10.0 i różnych (binarnych, tekstowych, długich, krótkich) plikach nie wystąpiło nic takiego. Więc albo coś spaprali w 5.10.1, albo to kwestia Twojego środowiska, tudzież jakieś efekty uboczne samego CGI. BTW, tak poza samym problemem, nie byłoby prościej, szybciej i efektywniej używać do tego X-Sendfile? Jeśli korzystasz z jakiegoś popularnego serwera typu apache, lighttpd czy nginx to one wspierają tę funkcjonalność (w nginxie to się inaczej nazywa ale działa podobnie).
Re: File::Copy syswrite binmode utf8 i nie wiadomo co
Author: Marcin Gryszkalis
Date: Sun, 10 Jan 2010 19:05
Date: Sun, 10 Jan 2010 19:05
35 lines
2117 bytes
2117 bytes
Adam Osuchowski wrote: > Próbowałeś wyizolować problem? Tzn. puścić np. z palca: > $ perl -MFile::Copy -e 'copy "plik", \*STDOUT' > /dev/null Z powłoki jest ok (nie ma błędu) > na tym samym pliku i zobaczyć czy pokazuje ten sam warning. A potem, > prosty skrypt CGI, który woła tylko copy() i nic więcej. Sprawdzę wieczorem. > U mnie na wersjach 5.8.8 i 5.10.0 i różnych (binarnych, tekstowych, > długich, krótkich) plikach nie wystąpiło nic takiego. Więc albo coś > spaprali w 5.10.1, albo to kwestia Twojego środowiska, tudzież jakieś > efekty uboczne samego CGI. Na to wygląda, ale popatrzę jeszcze... > BTW, tak poza samym problemem, nie byłoby prościej, szybciej i efektywniej > używać do tego X-Sendfile? Jeśli korzystasz z jakiegoś popularnego serwera > typu apache, lighttpd czy nginx to one wspierają tę funkcjonalność > (w nginxie to się inaczej nazywa ale działa podobnie). Wiem, używam nginx-a ale tam to wymaga odrobiny zmian w konfiguracji, bo nie można tak po prostu dowolnego pliku wysłać, więc na szybko chciałem zrobić copy. http://wiki.nginx.org/NginxXSendfile pozdrawiam -- Marcin Gryszkalis, PGP 0x9F183FA3 jabber jid:mg@fork.pl, gg:2532994 http://the.fork.pl
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads