Odczytywanie archiwów ZIP
W tym artykule przedstawię, jak za pomocą PHP można odczytywać zawartość zarchiwizowanych plików w popularnym formacie ZIP.
Konfiguracja PHP
Standardowo PHP nie posiada obsługi plików ZIP. Użytkownicy systemów uniksowych mogą użyć rozszerzenia ZZIPlib. Posiadacze Windowsa natomiast muszą sprawdzić, czy w katalogu /extensions znajduje się plik "php_zip.dll" (to czy tam jest zależy od wersji PHP). Jeżeli go tam nie ma, należy pobrać go z tej strony i w pliku php.ini dodać wpis "extension=php_zip.dll". Po dokonanych zmianach restartujemy serwer i funkcje obsługi ZIP'ów pwinniśmy mieć już dostępne.
Otwieramy ZIP'a
Do otworzenia pliku ZIP służy funkcja zip_open. Jako argument podajemy w niej ścieżkę do pliku. Uwaga! Jeżeli PHP jest zainstalowany jako moduł lub jeżeli serwer stoi pod systemem Windows, należy podać bezwzględną ścieżkę do pliku. Jeśli natomiast PHP działa jako plik wykonywalny bądź biblioteka, można podać ścieżkę względną. Funkcja zwróci nam uchwyt do otwartego pliku.
Kolejna funkcja, jakiej należy użyć, to zip_read. Jej argumentem jest stworzony wcześniej uchwyt na otwarte archiwum. Jak łatwo się domyślić jej zdaniem jest odczytywanie po kolei wszystkich spakowanych elementów (wykonujemy to w pętli). Funkcja zwraca uchwyt, ale już na konkretny plik w archiwum.
Przyszedł czas na opisanie funkcji odczytujących dane z zaarchiwizowanych plików. Oto ich lista:
- zip_entry_name - pobiera nazwę pliku, jako argument podajemy uchwyt stworzony funkcją zip_read
- zip_entry_filesize - pobiera rozmiar pliku, argument - jak wyżej
- zip_entry_compressedsize - pobiera rozmiar pliku po skompresowaniu, argument jw.
- zip_entry_compressionmethod - zwraca nazwę moetody kompresji pliku, argument jw.
- zip_entry_open - otwiera plik w celu odczytania jego zawartości, argumenty: uchwyt archiwum, uchwyt pliku, tryb (opcjonalnie, ale i tak aktualnie jest on ignorowany, gdyż PHP w obecnej wersji pozwala tylko na odczyt ZIP'ów), zwraca true lub false
- zip_entry_read - odczytuje zawartość spakowanego pliku, argumenty: uchwyt na plik, długość odczytywania (opcjonalnie)
- zip_entry_close - zamyka otwarty plik w archiwum, argument - uchwyt na plik
Po wykonaniu potrzebnych operacji otwarte archiwum należy zamknąć funkcją zip_close (parametrem jest uchwyt na archiwum).
Przykład kodu
Poniżej przedstawiam zaczerpnięty z Manuala przykład dobrze obrazujący użycie wszystkich funkcji operujących na ZIP'ach:
![]()
$zip = zip_open("plik.zip");
![]()
if ($zip) {
![]()
while ($zip_entry = zip_read($zip)) {
echo "Nazwa pliku: " . zip_entry_name($zip_entry) . "<br>";
echo "Rozmiar: " . zip_entry_filesize($zip_entry) . "<br>";
echo "Rozmiar po skompresowaniu: " . zip_entry_compressedsize($zip_entry) . "<br>";
echo "Metoda kompresji: " . zip_entry_compressionmethod($zip_entry) . "<br>";
![]()
if (zip_entry_open($zip, $zip_entry, "r")) {
echo "Zawarto¶ć:<br>";
$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
echo "$buf<br><hr>";
![]()
zip_entry_close($zip_entry);
}
echo "n";
![]()
}
![]()
zip_close($zip);
![]()
}
![]()










