Vollständige Version anzeigen : Angst vor 'Speicherhunger' bei großen Downloads
Hi,
wollte mal fragen ob jmd Praxiserfahrung mit großen Downloads hat. Aus Sicher-
heitsgründen biete ich Downloads grundsätzlich nur per "readfile-methode" an,
also ich setze die headers und sende dann den bytestream.
Da meine Downloads z.Zt bis max 100mb groß sein können, geht das natürlich
auf den Speicher. readfile() lädt da alles rein, also allokiert dann über 100mb
für einen Download.
Wie sieht das aus wenn jetzt zB 10 Leute mit DSL1000 jew. 100mb ziehen?
Kann ich dann damit rechnen dass ca. 1.5gb Speicher weg sind? Da diese
dann ja nur mit 120kb/s ziehen wär die "Belastung" ja schon enorm.
oder irre ich mich?
aktuell ich sende den bytestream als chunks in 8kb packets, aber im Prinzip löst
das ja nicht das Problem.
$fh = fopen( $fullFileName, 'rb' );
while( !feof( $fh ) )
echo fread($fh, 8192); // 8KB
fclose($fh);
thx für eure Erfahrungen
marco
KingCrunch
09.04.2008, 12:43
Eigentlich sollte die Variante mit den Chunks funktionieren, weil er ja eigentlich das, was aus der Datei liest, gleich wieder "verliert". Wie wärs, wenn du es mal ausprobierst, indem du zB bei dir lokal ein Download simulierst und per memory_get_peek_usage() die Werte bei sehr kleinen und sehr großen Chunks vergleichst? Würd mich zumindest interessieren :)
ice-breaker
09.04.2008, 12:43
Neija die Lösungist ja natürlich alles andere als doll, ist ja klar, ich würde folgendes vorschlagen:
Lighttpd statt Apache nutzen und dort X-Sendfile nehmen, du kannst dann in deiner PHP-Applikation einfach diesen Header setzen und wenn Lighttpd die Daten von PHP zurückbekommt und diesen Header sieht, sendet Lighttpd für dich die angegebene Datei.
Du müsstest also nicht mehr selbst die Datei lesen sondern sagst einfach, hey sende doch mal dem Client die Datei, der macht das für dich, und weitaus effizienter.
Vllt gibt es sowas auch als Apache-Modul, ist mir aber nicht bekannt
Edit: mod_xsendfile (http://tn123.ath.cx/mod_xsendfile/) solltest du trotz aller Lighttpd-Vorteile doch dem Indianer treu bleiben ^^
ice: lighthttpd scheitet vorerst aus, erst wenn die eigene serverfarm steht :)
king: jp, sehr gute idee, werde ich später ma testen
ice-breaker
09.04.2008, 12:46
ice: lighthttpd scheitet vorerst aus, erst wenn die eigene serverfarm steht :)
habe in meinen Beitrag ein Apache-Plugin gepackt, der das gleiche macht ;)
DennisBecker
09.04.2008, 12:50
habe in meinen Beitrag ein Apache-Plugin gepackt, der das gleiche macht ;)
Bedeutet das auch, dass ich in keinen PHP Timeout komme? Verstehe das Prinzip noch nicht so ganz... Ich muss nämlich demnächst auch noch eine Download-Verwaltung entwickeln, allerdings muss diese auf diversen System-Konfigurationen funktionieren.
ice:
cool, das sieht schon mal vielversprechend aus :)
Auf lighty switchen ist unmöglich. Es gibt kein gutes (also was ich drunter verstehe) admin-
panel für ihn. Und webserver ohne Panel geht mal garnicht, da bin ich ja nur am rum-
schrauben bei jeder Änderung :)
KingCrunch
09.04.2008, 13:02
ice:
cool, das sieht schon mal vielversprechend aus :)
Auf lighty switchen ist unmöglich. Es gibt kein gutes (also was ich drunter verstehe) admin-
panel für ihn. Und webserver ohne Panel geht mal garnicht, da bin ich ja nur am rum-
schrauben bei jeder Änderung :)Angeblich (habs nie ausprobiert) soll man ja an LightHTTP garnicht so viel Schrauben müssen :)
Hi,
wollte mal fragen ob jmd Praxiserfahrung mit großen Downloads hat. Aus Sicher-
heitsgründen biete ich Downloads grundsätzlich nur per "readfile-methode" an,
also ich setze die headers und sende dann den bytestream.
Da meine Downloads z.Zt bis max 100mb groß sein können, geht das natürlich
auf den Speicher. readfile() lädt da alles rein, also allokiert dann über 100mb
für einen Download.
Wie sieht das aus wenn jetzt zB 10 Leute mit DSL1000 jew. 100mb ziehen?
Kann ich dann damit rechnen dass ca. 1.5gb Speicher weg sind? Da diese
dann ja nur mit 120kb/s ziehen wär die "Belastung" ja schon enorm.
oder irre ich mich?
aktuell ich sende den bytestream als chunks in 8kb packets, aber im Prinzip löst
das ja nicht das Problem.
$fh = fopen( $fullFileName, 'rb' );
while( !feof( $fh ) )
echo fread($fh, 8192); // 8KB
fclose($fh);
thx für eure Erfahrungen
marco
Halte ich für eine ineffiziente Lösung. Ich verstehe auch nicht, warum du meinst mehr Sicherheit zu haben, als bei normalen Downloads mit Zugriffsschutz, der ja vielfältig gestaltet sein kann.
Bei solchen Datenmengen und je höher die Frequentierung auf diese, ist ein PHP Skript einfach keine effiziente Technik. Ein eigener Server (Software) der eigene Prozesse hat, sollte das Mindeste sein für so eine Art von Service.
ice-breaker
09.04.2008, 13:17
Bedeutet das auch, dass ich in keinen PHP Timeout komme? Verstehe das Prinzip noch nicht so ganz... Ich muss nämlich demnächst auch noch eine Download-Verwaltung entwickeln, allerdings muss diese auf diversen System-Konfigurationen funktionieren.
ja der Timeout wird uninteressant, ich erkläre ds mal in Teilschritten:
Du rfust die Seite download.php auf, der Webserver verarbeitet die Anfragen und erkennt, dass er die Datei durch den PHP-Parser schicken muss, also tut er da. In dieser Datei steht jedoch nur ein Befehl, der X-SendFile Header das einen Link auf eine Zip-Datei enthält, und liefert alles zurück.
Der normale Apache würde das vllt noch durch andere Plugins jagen und dann raussenden, mit dem xsendfile-Plugin, prüft er die Header die PHP gesetzt hat ob ein x-sendfile drinne vorkommt. Wenn nicht ist es ihm egal, wenn doch, dann übernimmt der Apache das senden des Zip-Archives, wie wenn es in einem public-Verzeichnis gelegen hätte, nur das es dort eben nie lag.
Auf lighty switchen ist unmöglich. Es gibt kein gutes (also was ich drunter verstehe) admin-
panel für ihn. Und webserver ohne Panel geht mal garnicht, da bin ich ja nur am rum-
schrauben bei jeder Änderung :)
rumschrauben weil es kein confixx gibt oder wie?
Also ne subdomain und ähnliches einrichten ist wirklich simpel, und das sagt jemand der sonst nie Webserver und generell den Server einrichtet.
Also die Perofmance-Vorteile die mir Lighttpd bringt, überwiegen finde ich da die Zeitkosten. Denn Apache stirbt sich ja gerne mal mit seinen Threads tot (Thread-Starvation)
Angeblich (habs nie ausprobiert) soll man ja an LightHTTP garnicht so viel Schrauben müssen :)
Muss man auch nicht, also einmal eingestellt und das wars. Was schreibt ihr denn groß an den Webservern rum?
KingCrunch
09.04.2008, 13:20
Halte ich für eine ineffiziente Lösung. Ich verstehe auch nicht, warum du meinst mehr Sicherheit zu haben, als bei normalen Downloads mit Zugriffsschutz, der ja vielfältig gestaltet sein kann.
Bei solchen Datenmengen und je höher die Frequentierung auf diese, ist ein PHP Skript einfach keine effiziente Technik. Ein eigener Server (Software) der eigene Prozesse hat, sollte das Mindeste sein für so eine Art von Service.
Entschuldige, wenn ich dich abwürge. Ich ahne, dass mir damit wieder irgendwas unterstellt wird ;)
Normaler Download über webserver hat durchaus seine Grenzen und es gibt genug Diskussionen, die sowas durchkauen. Es bringt wenig, wenn die wieder aufgewärmt werden.
Was machst du zum Beispiel, wenn ein Download-Link nur begrenzte Zeit gültig sein soll? Is ne rethorische Frage, ich erwarte nicht wirklich eine Antwort :)
Muss man auch nicht, also einmal eingestellt und das wars. Was schreibt ihr denn groß an den Webservern rum?Jemand, der es muss ;)
ja der Timeout wird uninteressant, ich erkläre ds mal in Teilschritten:
Du rfust die Seite download.php auf, der Webserver verarbeitet die Anfragen und erkennt, dass er die Datei durch den PHP-Parser schicken muss, also tut er da. In dieser Datei steht jedoch nur ein Befehl, der X-SendFile Header das einen Link auf eine Zip-Datei enthält, und liefert alles zurück.
Der normale Apache würde das vllt noch durch andere Plugins jagen und dann raussenden, mit dem xsendfile-Plugin, prüft er die Header die PHP gesetzt hat ob ein x-sendfile drinne vorkommt. Wenn nicht ist es ihm egal, wenn doch, dann übernimmt der Apache das senden des Zip-Archives, wie wenn es in einem public-Verzeichnis gelegen hätte, nur das es dort eben nie lag.Klingt wirklich interessant ^^
ice-breaker
09.04.2008, 13:24
Was machst du zum Beispiel, wenn ein Download-Link nur begrenzte Zeit gültig sein soll? Is ne rethorische Frage, ich erwarte nicht wirklich eine Antwort :)
Ich unterstelle dir nichts ;)
Ganz einfach, nach dem Prinzip von x-sendfile geht die Anfrage für das File ja immer an die PHP-Datei, von daher kannst du dort ja checken ob der Download noch gültig ist etc, du kannst komplexe Berechungen ausführen, wie es dir beliebt.
Du sendest dann eben ein X-Sendfile damit der Webserver etwas raussendet, oder zB einen 404 oder ähnliches wenn der Download nicht mehr gesendet werden soll
DennisBecker
09.04.2008, 13:51
Ist diese Lösung mit X-Sendfile Header auch möglich, wenn ein Server dieses Addon nicht installiert hat? Wie passe ich dann Sinnvoll die PHP-Script Timeouts an?
KingCrunch
09.04.2008, 13:58
Ist diese Lösung mit X-Sendfile Header auch möglich, wenn ein Server dieses Addon nicht installiert hat? Wie passe ich dann Sinnvoll die PHP-Script Timeouts an?
TimeOut ist weniger das Problem, eher max_execution_time (http://de3.php.net/set_time_limit).
DennisBecker
09.04.2008, 15:46
Aha, das klappt auch immer wenn der sfae_mode = off ist? Interessant :)
vBulletin® v3.6.12, Copyright ©2000-2010, Jelsoft Enterprises Ltd.