2013-04-20 18 views
9

Mam foldery, które mają generowane przez użytkownika obrazy, które są dość duże. Podczas próby skompresowania tych plików otrzymuję błędy związane z plikami zip o rozmiarze 1,5 gig.Pamięć archiwum zip php, rozmiar i maksymalny rozmiar pliku

Moje pytania dotyczą pamięci i myślę, że php trzyma zarówno otwarty zamek, jak i wszystkie obrazy w pamięci. Możliwym rozwiązaniem jest wysłanie każdego obrazu po przesłaniu do pliku zip oprócz odpowiedniego folderu, wydaje się, że to działa, ale jakie są ograniczenia rozmiaru pliku zip, z czego mogę znaleźć około 4 GB. W jaki sposób wpływa to/wpływa na ilość pamięci RAM na serwerze? \ I jest limitem w rzeczywistości 4GB lub czy mogę dalej dodawać pliki do suwaka w nieskończoność, czy też powinienem sprawdzić rozmiar pliku zip i czy jest ponad X koncerty zmieniają nazwę i tworzą nowy zip. Szukałem google i czytałem dokumentację, ale znalazłem sprzeczne informacje lub niekompletne informacje, więc szukam ostatecznych odpowiedzi i porad. Dzięki

+0

ile pamięci może mieć skrypt php z twoją konfiguracją (patrz php.ini ==> phpinfo() – Dukeatcoding

+1

lepiej byłoby wykonać zewnętrzny 'zip' przez' exec() '. NIE chcesz php proces wysysania multi-gigów ram. –

+0

@Duke 32m po wyjęciu z pudełka, ale ustawiłem go na 128m –

Odpowiedz

2

użycie php exec i wywołać narzędzie zip w wierszu poleceń

exec("tar -zcvf archive.tar.gz /folder/tozip"); 

Pamiętaj, że użytkownik, który wykonuje plik PHP ma dostęp do folderu, który chcesz zip

I weź opieka nad kodem wtrysku.

+0

czy będzie ograniczenie liczby plików lub rozmiaru końcowego pliku, który mogę skompresować za pomocą exec? –

+0

normalnie nie, o ile system plików może handlować z nadchodzącym filesize – Dukeatcoding

9

W przypadku nadal chcesz używać PHP ZipArchive, istnieje kilka rzeczy, które można zrobić, aby zapobiec pewne ograniczenia server/OS:

  • pamięci Choć może się to wydawać oczywiste, w przypadku, widziałem wiele przykładów, jak używać ZipArchive, które używają addFromString, aby dodać nowy plik do archiwum. NIE! Spowoduje to przydzielenie pamięci, aby otworzyć plik i zapisać w nim jego zawartość, co spowoduje szybkie wyczerpanie pamięci, zamiast tego użyj addFile. Upewnij się także, że uwolnisz całą pamięć, której nie potrzebujesz.

  • czas wykonywania Zwiększ maksymalny czas wykonania skryptu, albo poprzez php.ini, lub z ini_set (np ini_set('max_execution_time', 600); mieć maksymalny czas realizacji wynosi 10 minut)

  • pliku Uchwyty Some System operacyjny ma ograniczenia co do liczby otwartych plików, które mogą powodować problem, ponieważ PHP dodaje pliki do zip dopiero po zamknięciu pliku zip. Aby zapobiec problemom związanym z liczbą otwartych plików, wystarczy zamknąć i ponownie otworzyć plik zip co x plików (np. Co 1000), co zmusi PHP do kompresowania i dodawania plików już przypisanych do archiwum.

  • Rozmiar pliku Mogą istnieć pewne ograniczenia rozmiaru pliku systemu operacyjnego, większy plik oznacza także, że PHP potrzebuje więcej pamięci do zarządzania nim, więc ja osobiście wolę używać maksymalny rozmiar pliku, po którym ja po prostu otworzyć nowy plik zip przy użyciu numeru indeksu. Jeśli dokładny rozmiar pliku nie ma znaczenia dla ciebie, możesz po prostu policzyć rozmiar plików wchodzących do archiwum, a następnie przełączać się po osiągnięciu określonego limitu lub możesz zamknąć archiwum co x plików i sprawdzić jego rozmiar na dysku zdecydować pogoda do rozpoczęcia nowego archiwum, czy też nie (należy pamiętać, pliki dostać tylko sprężone po blisko archiwum)

osobiście chciałbym ograniczyć rozmiar pliku poprzez uzyskanie rozmiaru plików wchodząc w archiwum i zastosowanie prawdopodobnego współczynnika kompresji, aby zobaczyć, kiedy prawdopodobnie osiągnięty zostanie maksymalny rozmiar archiwum (pliki jpg ~ 0.9, zip files = 1, pliki tekstowe ~ 0.10, ...), a następnie przejdź do następnego woluminu.

+1

Właśnie uratowałeś życie !!! – Omolara

+0

Czy "addGlob()" byłoby lepszym rozwiązaniem do dodania wszystkich plików z folderu? – Mirko

Powiązane problemy