Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] PHP Performance Problem String Concatenation

Einklappen

Neue Werbung 2019

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

  • [Erledigt] PHP Performance Problem String Concatenation

    Ich hab ein PHP-Script für ein dynamisch generiertes download File ohne Zwischenspeichern auf dem Server:
    Das dynamische File wird per .= String Concatenation aus einzelnen Files vom Server (welche in Variablen gelesen wurden) zusammengesetzt.
    Problem: Insgesamt werden ca. 20 Stücke zusammengefügt, 7 sind ca. 1MB groß, eine Datei ist 30MB groß, und der Rest sind einzelne Bytes. Das Script dauert teilweise mehr als 20 Sek, verursacht durch das 30MB Stück.

    Frage: Wie kann ich es schneller zusammenfügen?


    PHP-Code:


       $download 
    $download pack("L",$startdata*1);
       foreach (
    $myfiles as $myfiles_name => $myfiles_value)
           {
               
    $download $downloadpack("L",$filesize[$myfiles_name]);
               
    $somebytes $something;
               
    $download $downloadpack("L",$somebytes);
               
    $download $download $myfiles[$myfiles_name];
           }
       
       
    // Download senden
            
       
    header("Content-Type: application/octet-stream");
       
    $save_as_name "download.bck";
       
    header("Content-Disposition: attachment; filename=\"$save_as_name\"");
       echo 
    $download
    Danke für eure Hilfe!

  • #2
    versuch es doch mal mit implode(), oder schreib das ganze temporär in eine Datei.
    [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

    Kommentar


    • #3
      Statt erstmal alles einzulesen, in einen String zu packen und den dann am Ende auszugeben, könnte man auch alles direkt ausgeben.

      PHP-Code:
         header("Content-Type: application/octet-stream"); 
         
      $save_as_name "download.bck"
         
      header("Content-Disposition: attachment; filename=\"$save_as_name\""); 

         echo 
      pack("L",$startdata*1); 
         foreach (
      $myfiles as $myfiles_name => $myfiles_value
             { 
                 echo 
      pack("L",$filesize[$myfiles_name]); 
                 
      $somebytes $something
                 echo 
      pack("L",$somebytes); 
                 echo 
      $myfiles[$myfiles_name]; 
             } 

      Grüße.

      Kommentar


      • #4
        Sicher, dass es nicht einfach so lange dauert, die Datei herunterzuladen?

        Kommentar


        • #5
          Vielen Dank für die Hilfe,
          implode bringt etwas Verbesserung, aber das einfachste ist hier auch das beste (direkt mit echo raus - danke php1704).

          Ich habe jetzt auch gar nicht mehr die Dateien gleichzeitig im Speicher, da ich direkt mit echo get_file_contents rausschreibe.

          Der Code sieht jetzt so aus:

          PHP-Code:
           header("Content-Type: application/octet-stream");
             
          $save_as_name "download.bck";
             
          header("Content-Disposition: attachment; filename=\"$save_as_name\"");

             echo  
          pack("L",$startdata*1);
             foreach (
          $myfiles as $myfiles_name => $myfiles_value)
                 {
              echo 
          pack("L",$filesize[$myfiles_name]);
                     
          $somebytes $something;
                     echo 
          pack("L",$somebytes);
                     echo 
          file_get_contents($myfiles_filepath[$myfiles_name];
                 } 
          Hintergrund:
          Das script lief auf 2 verschiedenen virtuellen Apaches. Bei Server A haben 50% der clients (in Abhängigkeit der download-Größe -z.B. 43MB, bzw. der Anzahl der Einzelteile z.B. 9) keine Antwort vom Server bekommen, bei Server B kam gar keine Antwort.

          Nachdem "max_execution_time" bei beiden Servern von 30 auf 10000 hochgesetzt wurde, wurden vom A alle Anfragen richtig bedient. Bei B (der generell mehr Last hat) nicht.
          Wenn die downloads nicht mehr "ganz so groß" waren, gab es ausser "richtige Antwort" und "keine Antwort" noch eine neue Situation, z.B. beim Firefox kam die seltsame Meldung
          "Fehler: Datei nicht gefunden" "Die Dateien unter <url> konnten nicht gefunden werden"

          Mit der echo Version läuft es jetzt bei A und B!

          Kommentar

          Lädt...
          X