Hallo!Ich wende mich (mal wieder ;-) mit einem Problem an Euch, welches ich nicht schaffe selbst zu lösen.
Ich liefere einige Downloads auf unserer Webseite per Perl/CGI-Script aus, da aus Sicherheitsgründen die Dateien in einem Verzeichnis liegen, das vom Webserver nicht zugänglich sind.
Das Ganze mache ich heute so:
(Bsp. gekürzt)
#!/usr/bin/perl$file = $query{'file'};
if (-e "$pathfiledepot/$file") {
open(F,"<$pathfiledepot/$file") || die "Missing file/dir.";
flock(F,2) if($flock);
binmode(F);
print "Content-Type: application/octet-stream\n\n";
print <F>;
flock(F,8) if($flock);
close(F);
exit;
}
Das funktioniert mit kleineren Dateien auch sehr gut, aber sobald es sich um größere Dateien (z.B. 300 MB) handelt, geht der Server in die Knie.
Getestet habe ich das Ganze zu Hause unter Windows Vista/Apache mit einer 1 GB-Datei: Der Speicherverbrauch steigt um gut 1-2 GB und die CPU-Usage geht auf 100% für mehrere Sekunden/Minuten. Dann startet der Download im Browser. Auf meinem Webserver geht garnichts und der Download bricht sofort mit einem "Serverfehler" ab - ich vermute, dass der Server das CGI/Perl-Skript abbricht, weil der Recourcenverbrauch zu hoch ist.
Ich denke, dass das Perlskript zunächst die komplette Datei in den Speicher lädt und erst dann an den Browser weitergibt.
Nun die Gretchenfrage: Wie realisiert man denn so ein Downloadskript "richtig"?
Ich stelle mir das so vor, dass das Perlscript die Datei nicht vollständig öffnet, sondern einfach "Zeile für Zeile" einliest und an den Browser weitergibt.
ich hoffe mir kann jemand weiterhelfen!
Danke,
Michael
Datum: 14.12.2009-19:45
