dodaj tą stronę do ulubionych     
użytkownicy online 26, liczba odwiedzin: 1254776
książki i porady dla programistów i webmasterów porady dla budujących strony internetowe i webmasterów jezus jest królem polski 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:
&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:
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:

&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;



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

    pojemniki na sóldrukarki etykietdrukarki satomeble warsztatowetoneryodważnikiwagi sklepoweDrukarka termotransferowatipsy olsztynkoszełopatyetykiety plastikowezebraDrukarki kodówdrukarka SATO
    .
    edyta wakulińska

    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