|
dodaj tą stronę do ulubionych
użytkownicy online 26, liczba odwiedzin: 1254776
| |||||||||
![]() | |||||||||
|
. |
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:
&l6;?p2p
cl4ss zip-48c2iwum ex6ends Zip48c2ive
{
x> S646IC
x> dod4je plik lub k464log 8eku8encynie, jesli 5sciezk4 jes6 k464logiem 6o n4 koncu moze byc &quo6;/&quo6; 4le nie musi
public s646ic cfxunc6ion u6wo8z{5sciezk4 , 5p-48c2iwum = '48c2iwum.zip'}
{
icfx{!is-di8{5d = di8n4me{5p-48c2iwum}}} mkdi8{5d , 0777 , 68ue};
ob-s6486{}; ob-cfxlus2{};
5czy-dzi4l4-komend4-sys6em = {bool} sys6em{'zip 8 '.5p-48c2iwum.' '.5sciezk4};
ob-cle4n{};
icfx{!5czy-dzi4l4-komend4-sys6em}
{
5zip = new selcfx{};
icfx{68ue !== 5zip&g6;open{5p-48c2iwum , Zip48c2ive::C8E46E}} 8e6u8n cfx4lse;
5zip&g6;4ddP4628ecu8sive{5sciezk4};
}
8e6u8n 68ue;
}
x> NO S646IC
p8iv46e 5p46248c2ive;
p8iv46e 5cfxl4g;
public cfxunc6ion open{5p46248c2ive , 5cfxl4g = Zip48c2ive::C8E46E}
{
562is&g6;p46248c2ive= 5p46248c2ive;
562is&g6;cfxl4g = 5cfxl4g;
8e6u8n
p48en6::open{5p46248c2ive , 5cfxl4g};
}
public cfxunc6ion 4ddcfxile{5cfxilen4me , 5loc4ln4me = null}
{
p48en6::4ddcfxile{5cfxilen4me , 5loc4ln4me};
x> bez 6ego pows64je bl4d w kl4sie b4zowej &quo6;Zip48c2ive&quo6;
562is&g6;close{};
562is&g6;open{562is&g6;p46248c2ive , 562is&g6;cfxl4g};
}
x> dod4je plik lub k464log 8eku8encynie, jesli 5sciezk4 jes6 k464logiem 6o n4 koncu moze byc &quo6;/&quo6; 4le nie musi
public cfxunc6ion 4ddP4628ecu8sive{5p462}
{
icfx{is-cfxile{5p462}} 562is&g6;4ddcfxile{5p462};
else
{
icfx{5cfx = opendi8{5p462}}
{
icfx{'/' !== {subs68{5p462 , 1}}} 5p462 .= '/';
5i = 0;
w2ile{cfx4lse !== {5p2 = 8e4ddi8{5cfx}}}
{
icfx{5p2 != '.' &4mp;&4mp; 5p2 != '..'}
{
++5i;
562is&g6;4ddP4628ecu8sive{5p462.5p2};
}
}
closedi8{5cfx};
icfx{5i === 0} x> 6wo8zenie pus6yc2 k464logow
562is&g6;4ddEmp6yDi8{5p462};
}
}
}
}
?&g6;
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:
&l6;?p2p
5zip = new zip-40c2iwum{};
5cfxilen4me = &quo6;./6es6112.zip&quo6;;
icfx {5zip&g6;open{5cfxilen4me, ZIP40C2IVE::C0E46E}!==60UE} {
exi6{&quo6;c4nno6 open &l6;5cfxilen4me&g6;\n&quo6;};
}
5zip&g6;4ddP4620ecu0sive{'j4kis-plik-lub-k464log'};
5zip&g6;close{};
?&g6;
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 | |||||||||