Czasami mamy potrzebę wysłania na serwer dużej ilości małych plików. Robiąc to na piechotę (wysłanie każdego pliku oddzielnie) szybko się przekonamy, że zajmuje to wieczność. Dzieje się tak dlatego, że w połączeniu FTP na każdy pojedynczy plik tworzona jest oddzielna sesja wysyłania (czyli kilka komend musi przejść i być rozpoznanych w tę i tamtą stronę, co zajmuje parę sekund), co powoduje, że przy większych ilościach możemy spędzić noc nad tym.
Dlatego popularną praktyką jest wpierw pakowanie takich plików jako archiwum zip, wysłanie na serwer i ich rozpakowanie na miejscu. Taka kolej czynności jest z wiadomych względów o wiele mniej zajmująca czasowo (zwłaszcza, że serwery to często potężne maszyny obliczeniowe, dla których algorytmy dekompresji to pikuś). Pierwszą i drugą kwestię z listy na pewno większość wykona bez problemu. A co z rozpakowaniem na serwerze?
Jest kilka sposobów na odzyskanie zawartości archiwum bezpośrednio na serwerze.
Najprostsza z nich, to użycie konta shellowego jakie udostępniła nam firma hostingowa. Programy FTP takie jak WinSCP obsługują tego typu połączenia i z ich poziomu zazwyczaj wystarczy wybrać polecenie “UnZip” z menu, by wszystko wykonało się samo.
Jeżeli nie mamy takiego programu i z jakiego powodu nie chcemy (dziwny by musiał to być powód, ale i takie się zdarzają), to zawsze możemy ręcznie się połączyć pod Shell’a używając np. darmowego Putty. Z jego poziomu już wystarczy tylko wydać odpowiednia komendę, np:
unzip -ou mojplik.zip -d ./
Gdzie zapis “./” oznacza rozpakuj do obecnego folderu.
No tak – ale często jest tak, że firma hostingowa nie udostępnia na danym serwerze konta shellowego. Aczkolwiek często dalej mamy możliwość wykonania powyższego polecenia – o ile serwer nie ma zablokowanego wykonania funkcji “shell_exec” będącego de facto wykonaniem komendy shellowej. Czyli możemy umieścić sobie na serwerze plik php o treści:
-
<?php
-
-
-
?>
Ok, ale w przypadku zablokowania owej funkcji jesteśmy praktycznie zdani na sam PHP i FTP. Najprościej wtedy sprawdzić, czy mamy w interpreterze php na serwerze zainstalowany moduł ZipLib (standardowe php_info(); i powinno się dać znaleźć w którejś linijce). Jeżeli tak, to też tworzymy plik php, tyle, że o trochę innej treści.
-
<?php
-
-
$arch = new ZipArchive;
-
$arch->open("mojplik.zip");
-
$arch->extractTo("./");
-
$arch->close();
-
-
?>
Użyliśmy w tutaj klasy ZipArchive udostępnionej przez dany moduł. Na efekt działania trzeba będzie trochę poczekać (co przy restrykcyjnych czasach wykonania na niektórych serwerach, może być problemem) lecz to jest dobra alternatywa.
A co zrobić, jeżeli nawet i to nie jest dostępne?
Należało by się wtedy posilić czystym PHP i poszukać jakiejś całej klasy z algorytmem rozpakowującym w jednym pliku php. W internecie można bez większych problemów takową znaleźć. Aczkolwiek – ja osobiście, przy tylu restrykcjach, prędzej bym zmienił serwer lub dostawcę. Może trwało by i dłużej, ale za to na przyszłość mniej nerwów i większa wygoda…