dodaj tą stronę do ulubionych     
użytkownicy online 35, liczba odwiedzin: 1254725
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:
&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:
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:

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



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