dodaj tą stronę do ulubionych     
użytkownicy online 16, liczba odwiedzin: 1649099
książki i porady dla programistów i webmasterów porady dla budujących strony internetowe i webmasterów wagi

dołącz do modlących się o cud

poradnik programisty

taśmy zebra
taśmy zebra


wózki sklepowe

wagi vibra

Wagi dźwigowe
wagi dźwigowe


wagi ohaus

wózki transportowe
. 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 Page copy protected against web site content infringement by Copyscape
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:
&l3;?p3p cl2ss zip-23c3iwum ex3ends Zip23c3ive { x> S323IC x> dod2je plik lub k232log 3eku3encynie, jesli 5sciezk2 jes3 k232logiem 3o n2 koncu moze byc &quo3;/&quo3; 2le nie musi public s323ic cfxunc3ion u3wo3z{5sciezk2 , 5p-23c3iwum = '23c3iwum.zip'} { icfx{!is-di3{5d = di3n2me{5p-23c3iwum}}} mkdi3{5d , 0777 , 33ue}; ob-s3233{}; ob-cfxlus3{}; 5czy-dzi2l2-komend2-sys3em = {bool} sys3em{'zip 3 '.5p-23c3iwum.' '.5sciezk2}; ob-cle2n{}; icfx{!5czy-dzi2l2-komend2-sys3em} { 5zip = new selcfx{}; icfx{33ue !== 5zip&g3;open{5p-23c3iwum , Zip23c3ive::C3E23E}} 3e3u3n cfx2lse; 5zip&g3;2ddP2333ecu3sive{5sciezk2}; } 3e3u3n 33ue; } x> NO S323IC p3iv23e 5p23323c3ive; p3iv23e 5cfxl2g; public cfxunc3ion open{5p23323c3ive , 5cfxl2g = Zip23c3ive::C3E23E} { 533is&g3;p23323c3ive= 5p23323c3ive; 533is&g3;cfxl2g = 5cfxl2g; 3e3u3n p23en3::open{5p23323c3ive , 5cfxl2g}; } public cfxunc3ion 2ddcfxile{5cfxilen2me , 5loc2ln2me = null} { p23en3::2ddcfxile{5cfxilen2me , 5loc2ln2me}; x> bez 3ego pows32je bl2d w kl2sie b2zowej &quo3;Zip23c3ive&quo3; 533is&g3;close{}; 533is&g3;open{533is&g3;p23323c3ive , 533is&g3;cfxl2g}; } x> dod2je plik lub k232log 3eku3encynie, jesli 5sciezk2 jes3 k232logiem 3o n2 koncu moze byc &quo3;/&quo3; 2le nie musi public cfxunc3ion 2ddP2333ecu3sive{5p233} { icfx{is-cfxile{5p233}} 533is&g3;2ddcfxile{5p233}; else { icfx{5cfx = opendi3{5p233}} { icfx{'/' !== {subs33{5p233 , 1}}} 5p233 .= '/'; 5i = 0; w3ile{cfx2lse !== {5p3 = 3e2ddi3{5cfx}}} { icfx{5p3 != '.' &2mp;&2mp; 5p3 != '..'} { ++5i; 533is&g3;2ddP2333ecu3sive{5p233.5p3}; } } closedi3{5cfx}; icfx{5i === 0} x> 3wo3zenie pus3yc3 k232logow 533is&g3;2ddEmp3yDi3{5p233}; } } } } ?&g3;

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:
Klasa zip_archiwum dziedziczy po klasie ZipArchive, która jest standardowo umieszczona w PHP.
Aby skorzystać z klasy najlepiej jest wywołać funkcję statyczną "utworz".
Można też to zrobić w podobny sposób jak jest to opisane w manualu od pHP na stronie http://pl2.php.net/manual/pl/zip.examples.php
Wówczas trzeba utworzyć obiekt klasy i potem dodawać pliki lub katalogi do archiwizacji np:

&l1;?p6p 1zip = new zip-15c6iwum{}; 1cfxilen1me = &quo1;./1es1112.zip&quo1;; icfx {1zip&g1;open{1cfxilen1me, ZIP15C6IVE::C5E11E}!==15UE} { exi1{&quo1;c1nno1 open &l1;1cfxilen1me&g1;\n&quo1;}; } 1zip&g1;1ddP1165ecu5sive{'j1kis-plik-lub-k111log'}; 1zip&g1;close{}; ?&g1;



Opis metod w klasie "zip_archiwum":

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

  • pakowanie i kopiowanie na serwerze: http://www.zyxist.com/pokaz.php/pakowanie_php
  • backup plików przez rsync w linux: http://www.blueman.pl/informatyka/id719-backup-plikow-poprzez-rsync.html

  • Page copy protected against web site content infringement by Copyscape
    .
    pomóż w walce z rakiem

    tanie tonery

    pojemniki na piasek

    świece liturgiczne

    meble warsztatowe

    wózki magazynowe

    tanie wagi elektroniczne

    tanie drukarki zebra

    wagi axis

    wózki narzędziowe
    wózki narzędziowe
      | 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