Ressourcensparend Dateien ausgeben

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Ressourcensparend Dateien ausgeben

    Guten Abend,

    seit heute beschäftigt mich die Frage, wie man mit PHP am besten Dateien ausgibt (z.B. Downloadscript).

    Methode 1:
    PHP-Code:
    readfile($datei); 
    Methode 2:
    PHP-Code:
    $readsize=1024*1024;
    $fp=fopen($_GET[data], r);  
    while(!
    feof($fp))  {   
         
    $data=fread($fp$readsize);   
          echo 
    $data
         
    flush();  

    fclose($fp); 

    Hier habe ich mal 2 Methode aufgelistet, die mir eingefallen sind.

    Methode 2 ist ja wesentlich ressourcensparender als Methode 1, weil die Datei nur Stückweise gelesen wird und danach der Puffer ausgegeben wird. Methode 1 liest die Datei komplett und gibt nur nach und nach aus.


    Gibt es noch weitere Möglichkeiten, die ressourcensparender als Methode 2 sind? Wenn ja, welche und wie?


    Vielen Dank für jede Antwort!
    Mfg
    Matthias
    Zuletzt geändert von mettykayo; 06.04.2007, 20:32.

  • #2
    Methode 1 liest die Datei komplett und gibt nur nach und nach aus.
    wie kommst du denn darauf? readfile ist genau so realisiert wie deine eigene methode 2, nur mit einem festen buffer (8 kb, afair).
    Gibt es noch weitere Möglichkeiten, die ressourcensparender als Methode 2 sind? Wenn ja, welche und wie?
    methoden, eine datei einzulesen und auszugeben gibt es zu genüge, sie stehen alle im manual. für einen download jedoch wird die geschwindigkeit der ausgabe sowieso von der verbindungsgeschwindigkeit gebremst, daher ist es nicht wirklich zeitkritisch, ob du 1 oder 2 nimmst.

    und grundsätzlich gilt - solche fragen kann man selten pauschal beantworten. wenn du noch eine millisekunde herauskitzeln willst (wofür auch immer) - so teste zwei skripte mit beiden methoden ausführlich und dann weißt du es genauer, als jedes forum auf der welt. sind die ergebnisse großartig unterschiedlich (was ich nicht glaube, buffergröße hin oder her), zeige die testergebnisse bitte hier und wir besprechen sie zusammen.

    Kommentar


    • #3
      Original geschrieben von penizillin
      wie kommst du denn darauf? readfile ist genau so realisiert wie deine eigene methode 2...
      Die Funktion in sich bleibt gleich, aber es ist lange noch nicht das Gleiche. Sondern wie der Threadersteller schon sagt: viel Ressorcensparender.

      Denn bei der 2. Methode werden die ersten 1024kB geladen, gesendet und sofort wieder gelöscht. Dann werden die nächsten 1024kB der Datei geladen usw... Bis der Dateizeiger am Ende der Datei ist.

      Bei der ersten Methode, die eher nicht zu empfehlen ist, wird sofort der ganze Inhalt in die Variable geschrieben. D.h. die Datei wird in den Arbeitsspeicher verlagert bis der Download beendet ist.

      Ich spreche hier von großen Dateien. Bei kleinen Dateien wäre es in der Tat egal.

      Kommentar


      • #4
        Original geschrieben von rex2
        Denn bei der 2. Methode werden die ersten 1024kB geladen, gesendet und sofort wieder gelöscht.
        wobei ich finde, dass 1mb ziemlich viel ist (paralleler download).
        interessant ist auch der letzte kommentar auf: http://de.php.net/manual/de/function.fread.php bezüglich der dl-geschwindigkeit.

        Kommentar


        • #5
          Original geschrieben von rex2
          Bei der ersten Methode, die eher nicht zu empfehlen ist, wird sofort der ganze Inhalt in die Variable geschrieben. D.h. die Datei wird in den Arbeitsspeicher verlagert bis der Download beendet ist.
          ich habe doch gerade geschrieben, dass es nicht stimmt. lies noch mal meine antwort durch.

          Kommentar


          • #6
            Original geschrieben von penizillin
            ich habe doch gerade geschrieben, dass es nicht stimmt. lies noch mal meine antwort durch.
            Wieso stimmt diese Aussage nicht ? Ich habe es selber getestet!

            Kommentar


            • #7
              weil nichts in keine variable gespeichert wird, sondern in den output buffer geschrieben wird. und zwar gebuffert. und das ist genau das selbe, wie deine eigene methode, in grün.
              Ich habe es selber getestet!
              wie?

              Kommentar

              Lädt...
              X