webForumDet fria alternativet

Snabbare sätt att skapa en zip av filer med PHP?

PHP

1 svar · 1 128 visningar · startad av xtreme

Medlem sedan juli 20002 056 inlägg
Frågan#1

När användaren trycker på en knapp anropar jag en funktion i PHP. Funkionen hämtar länkar till bilder, lägger dem i en ZIP-fil och forserar en nedladdning av zip-filen till användaren.

Såhär ser min funktion ut idag.

        $zipName = 'name-'.date("Y-m-d").'.zip';

          # create new zip opbject
          $zip = new ZipArchive();

          # create a temp file & open it
          $tmp_file = tempnam('.','');
          $zip->open($tmp_file, ZipArchive::CREATE);

          # loop through each file
          foreach($this->imageUrl as $file){
              # Get extension
              $ext = pathinfo(parse_url($file->url, PHP_URL_PATH), PATHINFO_EXTENSION);

              # download file
              $download_file = file_get_contents($file->url);
    
              # add it to the zip              $zip->addFromString(basename($imageNumber.'-name.'.$ext),$download_file);
          }

            # close zip
            $zip->close();

            # send the file to the browser as a download
            header('Content-type: application/zip');
            header('Content-disposition: attachment; filename='.$zipName);
            header('Content-Length: ' . filesize($tmp_file));
            readfile($tmp_file);

Funktionen fungerar bra, dvs det sker en nedladdning med en zip-fil innehållande bilderna. Problemet är att det går väldigt långsamt att skapa zip-filen med bilderna (inte ladda ner). Har jag 10 bilder tar det runt 30 sekunder att generera zip-filen för nedladdning. Hämta bilderna går snabbt så det är själva skapandet av zip-filen som går långsamt.

Vad finns det för alternativ? Har sökt runt lite och verkar finnas några bibliotek som är rätt gamla och frågan är om de ger bättre resultat. Vissa hävdar även att det deras variant inte skriver en temporär fil på servern när zip-filen skapas vilket borde snabba upp processen.

Som sagt. Vad har ni för tips? Utöka hårdvaran är inget alternativ.

Medlem sedan aug. 20039 340 inlägg
#2

Laddar du ner filerna någonstans ifrån, eller är det lokala filer? Om det är nerladdningar så kan det nog ha lite att göra med varför det går långsamt. Prova att testköra samma filer som nerladdning samt lokalt från disk och mät skillnaden. Fundera på om du vet på förhand vilka filer som ska laddas ner och kör ett cron-jobb så att allt som är kvar att göra är att zippa de valda filerna på användarens begäran.
Om det är lokala filer, kör addFile istället för file_get_contents+addFromString. Det kanske t.o.m. går att ge addFile en http(s)-url direkt...

266 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
119 ms — ändringar (db)