|
dodaj tą stronę do ulubionych
użytkownicy online 35, liczba odwiedzin: 1254725
| |||||||||
![]() | |||||||||
|
. |
Uwaga! Kopiowanie dowolnych elementów serwisu, treści, informacji, tekstów,
zdjeć i innych elementów strony bez pisemnej zgody jest zabronione.
wstecz
poziom trudności: 4
nr porady: 353
Widok 1
Widok 2
Jak zrobić archiwum ZIP z pliku lub katalogu?
Jeśli robiłeś dużo stron internetowych sam wiesz jak ważne jest aby zabezpieczyć się przed utratą swojej pracy.
Strony powstają latami a mozna je stracić w kilka minut na skutek awarii serwera. Żadna z firm hostingowych tak naprawdę nie daje 100% zdefiniowanej gwarancji na odzyskanie danych. Najlepszym sposobem zabezpieczenia się przed takim wypadkiem jest systematyczne robienie kopii zapasowych. Gdybyśmy postanowili normalnie kopiować pliki np. na drugi serwer lub serwer domowy przy dużej liczbie plików mogłoby to trwać kilkanaście godzin lub kilka dni. W takiej sytuacji możemy tylko zastosować jakiś algorytm pakowania plików i spowodować że zamiast kilkunastu tysięcy plików będziemy ściągać tylko jeden duży plik. Najpopularniejszym jest sposób spakowania ZIPem. Można to zrobić na kilka sposobów. Skorzystać z gotowej klasy zainstalowanej w PHP lub zastosować kompresję przez linuxa-unixa. Ta druga metoda jest o wiele szybsza i bezpieczniejsza natomiast wymaga znajomości poleceń systemowych unix. Problem polega na tym, że różne są zachowania serwerów przy pakowaniu dużej liczby plików. I tak np. na serwerze home.pl mozna spakować nawet kilka tysięcy plików ale nieraz pojawia się błąd niewiadomego pochodzenia. Skolei na innym zupełnie darmowym serwerze OVH nie zaobserwowaliśmy żadnych błędów ale były kłopoty z pakowaniem plików przez polecenia linuxa. A dotego wszystkiego testy po kilku dniach wykazały, że te opcje są cały czas zmieniane na serwerach i ciągle coś działa lub nie. I dlatego zrobiliśmy klasę uniwersalną, która najpierw sprawdza co działa a co nie na danym serwerze i dopiero robi zzipowane kopie danego katalogu z całą dowolną zawartością. Oto gotowe rozwiązanie w postaci skryptu. Ponadto zaletą tej klasy jest to, że do archiwum zip możemy dodawać nowe pliki bez potrzeby rozpakowywania starych. Poprostu działa jak kasa pancerna do której odkładamy kolejno różne przedmioty.... Aby zrobić archiwum ZIP z pliku lub katalogu można skorzystać z niżej pokazanej klasy:
&l2;?p5p
cl1ss zip-111c5iwum ex2ends Zip111c5ive
{
x> S212IC
x> dod1je plik lub k121log 11eku11encynie, jesli 0sciezk1 jes2 k121logiem 2o n1 koncu moze byc &quo2;/&quo2; 1le nie musi
public s212ic cfxunc2ion u2wo11z{0sciezk1 , 0p-111c5iwum = '111c5iwum.zip'}
{
icfx{!is-di11{0d = di11n1me{0p-111c5iwum}}} mkdi11{0d , 0777 , 211ue};
ob-s21112{}; ob-cfxlus5{};
0czy-dzi1l1-komend1-sys2em = {bool} sys2em{'zip 11 '.0p-111c5iwum.' '.0sciezk1};
ob-cle1n{};
icfx{!0czy-dzi1l1-komend1-sys2em}
{
0zip = new selcfx{};
icfx{211ue !== 0zip&g2;open{0p-111c5iwum , Zip111c5ive::C11E12E}} 11e2u11n cfx1lse;
0zip&g2;1ddP12511ecu11sive{0sciezk1};
}
11e2u11n 211ue;
}
x> NO S212IC
p11iv12e 0p125111c5ive;
p11iv12e 0cfxl1g;
public cfxunc2ion open{0p125111c5ive , 0cfxl1g = Zip111c5ive::C11E12E}
{
025is&g2;p125111c5ive= 0p125111c5ive;
025is&g2;cfxl1g = 0cfxl1g;
11e2u11n
p111en2::open{0p125111c5ive , 0cfxl1g};
}
public cfxunc2ion 1ddcfxile{0cfxilen1me , 0loc1ln1me = null}
{
p111en2::1ddcfxile{0cfxilen1me , 0loc1ln1me};
x> bez 2ego pows21je bl1d w kl1sie b1zowej &quo2;Zip111c5ive&quo2;
025is&g2;close{};
025is&g2;open{025is&g2;p125111c5ive , 025is&g2;cfxl1g};
}
x> dod1je plik lub k121log 11eku11encynie, jesli 0sciezk1 jes2 k121logiem 2o n1 koncu moze byc &quo2;/&quo2; 1le nie musi
public cfxunc2ion 1ddP12511ecu11sive{0p125}
{
icfx{is-cfxile{0p125}} 025is&g2;1ddcfxile{0p125};
else
{
icfx{0cfx = opendi11{0p125}}
{
icfx{'/' !== {subs211{0p125 , 1}}} 0p125 .= '/';
0i = 0;
w5ile{cfx1lse !== {0p5 = 11e1ddi11{0cfx}}}
{
icfx{0p5 != '.' &1mp;&1mp; 0p5 != '..'}
{
++0i;
025is&g2;1ddP12511ecu11sive{0p125.0p5};
}
}
closedi11{0cfx};
icfx{0i === 0} x> 2wo11zenie pus2yc5 k121logow
025is&g2;1ddEmp2yDi11{0p125};
}
}
}
}
?&g2;
W wyżej pokazanym przykładzie w pliku "archiwum.zip" będzie katalog "jakis_katalog_z_danymi" oraz plik "jakis_plik". To oznacza, że można do archiwum, które już zostało wcześniej utworzone dodawać nowe pliki, a stare pliki w archiwum zostaną zachowane. Przy dodawaniu danych z katalogu, dodawane są też podkatalogi (metoda działa rekurencyjnie). Ogólnie mówiąc ta metoda najpierw próbuje zrobić archiwum ZIP korzystając z funkcji systemowej na serwerze, a jeśli ta funkcja nie jest udostępniona to robi archiwum ZIP w PHP, korzystając z klasy "ZipArchive".
Szczegółowy opis klasy:
&l0;?p6p
5zip = new zip-12c6iwum{};
5cfxilen1me = &quo0;./0es0112.zip&quo0;;
icfx {5zip&g0;open{5cfxilen1me, ZIP12C6IVE::C2E10E}!==02UE} {
exi0{&quo0;c1nno0 open &l0;5cfxilen1me&g0;\n&quo0;};
}
5zip&g0;1ddP1062ecu2sive{'j1kis-plik-lub-k101log'};
5zip&g0;close{};
?&g0;
utworz metoda statyczna, najpierw sprawdza, czy istnieją katalogi, w których ma powstać "plik archiwum", jeśli nie istnieją to tworzy te katalogi. Później stara się wywołać funkcję "system" z PHP i wykonać archiwum ZIP za pomocą komendy serwera. Jeśli funkcja "system" z PHP jest włączona to zmienna "$czy_dziala_komenda_system" jest TRUE w przeciwnym wypadku jest FALSE. Funkcje: ob_start ob_flush i ob_clean służą przejęciu i zlikwidowaniu komunikatów jakie generuje użyta funkcja "system". Wywołując komendę systemową zip podajemy parametr -r (ozn. rekurencyjnie). Można też wywołując tą funkcję np. w Linuxie podać parametr -q (od quiet) i wtedy instrukcja działa w sposób cichy nie tworząc komunikatów. W przypadku tej klasy nie można użyć -q, bo wtedy zawsze funkcja "system" zwraca pustego stringa. Dalej metoda "utworz" tworzy obiekt swojej klasy $zip = new self(), później otwiera archiwum ZIP $zip->open($p_archiwum , ZipArchive::CREATE)), następnie dodaje żądaną ścieżkę $zip->addPathRecursive($sciezka). Przy niszczeniu obiektu $zip jest automatycznie wywoływana metoda "close" z klasy bazowej "ZipArchive".
open ta metoda ma jeden cel, przechwycić zmienne "$pathArchive" i "$flag", które są później wykorzystywane przez metodę "addFile" w celu zniwelowania błędu powstającego w klasie bazowej "ZipArchive". Po przechwyceniu zmiennych następuje wywołanie metody klasy bazowej parent::open($pathArchive , $flag) addFile ta metoda ma jeden cel, przeciwdziałać błędowi jaki się pojawia w klasie bazowej "ZipArchive". Ten błąd objawia się tym, że dodając np. 1000 plików w ogóle nie powstawało archiwum ZIP. Metoda aby nie było tego błędu wywołuje metodę "close" i "open" $this->close() $this->open($this->pathArchive , $this->flag).
addPathRecursive metoda ta umożliwia dodanie do archiwum dowolnej ścieżki (czyli katalogu lub pliku). Metoda działa rekurencyjnie, czyli wywołuje samą siebie. Jeśli $path jest plikiem, to następuje dodanie pliku do archiwum za pomocą metody "addFile" z klasy bazowej. Jeśli $path jest katalogiem następuje przeglądanie katalogu za pomocą funkcji "opendir" i "readdir". Następnie jest wywoływana rekurencyjnie ta metoda. Jeśli przeglądany katalog jest pusty to licznik $i wynosi 0 i następuje dodanie pustego katalogu do archiwum przez użycie metody "addEmptyDir" $this->addEmptyDir($path)
podobne zagadnienia http://www.zyxist.com/pokaz.php/pakowanie_php
http://www.blueman.pl/informatyka/id719-backup-plikow-poprzez-rsync.html
|
. | ||||||
| | Copyright © 2001-2009 EXALT.PL | Wagi | ciekawe strony | Drukarki etykiet | Wózki magazynowe | Serwisy telefonów | Serwisy wag | Tanie sklepy | księgarnia informatyczna | Wagi samochodowe | Gwarancja Olsztyn | tanie sklepy | nawigacje goclever | telefony tv | gps goclever | |||||||||