paź 032008

Backup serwera www c.d.

Pisałem poprzednio o wykonywaniu kopii plików na serwerze współdzielonym. Rozwiązanie które podałem sprawdza się jednak gdy mamy dostęp do shella, ale z doświadczenia wiem że sytuacje takie są sporadyczne.

Napisałem więc skrypt, który robi praktycznie to samo wykorzystując jednak wbudowaną w PHP obsługę archiwów ZIP. Wykorzystałem do tego celu bibliotekę pclzip.lib.php dzięki której w łatwiejszy sposób można tworzyć pliki ZIP.

Skrypt backup-zip-full.php wykonuje pełną kopię wskazanego katalogu wraz z podkatalogami.

<?php
set_time_limit(0);
require_once('pclzip.lib.php');
$bdata=date('Y-m').'/';
$btime=date('Y-m-d_H-i');
if (!is_dir('../_backups/')) mkdir('../_backups/');
if (!is_dir('../_backups/'.$bdata)) mkdir('../_backups/'.$bdata);
$archive = new PclZip('../_backups/'.$bdata.'archive_full_'.str_replace('.', '_', $_GET['d']).'_'.$btime.'.zip');
$v_dir = '/www/directory/'.$_GET["d"];

$v_remove = $v_dir;
if (substr($v_dir, 1,1) == ':') $v_remove = substr($v_dir, 2);
$v_list = $archive->create($v_dir, PCLZIP_OPT_REMOVE_PATH, $v_remove);
if ($v_list == 0) die("Error : ".$archive->errorInfo(true));

?>
OK

Wywołanie jest z parametrem d, np.backup-zip-full.php?d=kadoro co oznacza spakowanie wybranego katalogu. Po wykonaniu pliku w katalogu ../backups/(bieżąca data) znajdziemy gotowe archiwum o nazwie np. archive_full_kadoro_pl_2008-10-03_15-17.zip

Wywołanie z parametrem zastosowałem ponieważ w zależności od ustawień serwera skrypt może działać jedynie określony czas, np. 30 lub 60 sekund po czym zakończy swoje działanie. Metoda ta może zatem być nieskuteczna dla wielkich katalogów. Mi bez problemu udało się uzyskać archiwum o wielkości 70 MB, a dzięki archiwizacji poszczególnych katalogów wszystkie archiwa zajęły ponad 300 MB.

Drugi ze skryptów działa na podobnej zasadzie, przy czym tworzy kopie przyrostowe. Data ostatniej archiwizacji zapisywana jest jako TIMESTAMP w pliku ../_backups/last-www-backup.txt

Skrypt backup-zip-incremental.php:

<?php
set_time_limit(0);

require_once('pclzip.lib.php');
$bdata=date('Y-m').'/';
$btime=date('Y-m-d_H-i');
if (!is_dir('../_backups/')) mkdir('../_backups/');
if (!is_dir('../_backups/'.$bdata)) mkdir('../_backups/'.$bdata);
$archive = new PclZip('../_backups/'.$bdata.'archive_incremental_'.str_replace('.', '_', $_GET['d']).'_'.$btime.'.zip');

$fname = '../_backups/last-www-backup.txt';
if (!file_exists($fname))
{
$handle = fopen($fname, "w");
fwrite($handle, time());
fclose($handle);
}
else
{
$handle = fopen($fname, "r");
$GLOBALS['org_mtime'] = fread($handle, filesize($fname));
fclose($handle);
}

function myPreAddCallBack($p_event, &$p_header)
{
$info = pathinfo($p_header['stored_filename']);
if ($p_header['mtime'] <= $GLOBALS['org_mtime']) return 0;
else return 1;
}
$v_dir = '/www/directory/'.$_GET["d"];

$v_remove = $v_dir;
if (substr($v_dir, 1,1) == ':') $v_remove = substr($v_dir, 2);
$v_list = $archive->create($v_dir, PCLZIP_CB_PRE_ADD, 'myPreAddCallBack', PCLZIP_OPT_REMOVE_PATH, $v_remove);

if ($v_list == 0) die("Error : ".$archive->errorInfo(true));

$handle = fopen($fname, "w");
fwrite($handle, time());
fclose($handle);
?>
OK

Wywołanie pliku jest podobne jakw pierwszym przypadku tj. backup-zip-incremental.php?d=kadoro- plik z archiwum będzie miał nazwę archive_incremental_kadoro_pl_2008-10-03_15-26.zip

W razie jakochkowleik pytań zachęcam do kontaktu lub zostawienia komentarza.

Kategoria: E-commerce 0 komentarzy

Dodaj komentarz

Your email address will not be published. Please enter your name, email and a comment.