Znalazłem ten post w Google jako drugi najlepszy wynik, najpierw użyłem exec :(
W każdym razie, chociaż nie odpowiadało to dokładnie moim potrzebom ... Postanowiłem zamieścić odpowiedź dla innych z moją szybką, ale rozszerzoną wersją tego.
CECHY SKRYPTU
- Nazewnictwo plików kopii zapasowych dzień po dniu, PREFIX-RRRR-MM-DD-POSTFIX.EXTENSION
- Raportowanie / brak pliku
- Poprzedni wykaz kopii zapasowych
- Nie zipuje / nie zawiera poprzednich kopii zapasowych;)
- Działa na Windows / Linux
W każdym razie, do skryptu ... Chociaż może to wyglądać na dużo ... Pamiętaj, że jest tu nadmiar ... Więc nie krępuj się, aby usunąć sekcje raportowania w razie potrzeby ...
Może również wyglądać niechlujnie, a niektóre rzeczy można łatwo wyczyścić ... Więc nie komentuj tego, to tylko szybki skrypt z podstawowymi komentarzami wrzuconymi ... NIE DO UŻYTKU NA ŻYWO ... Ale łatwe do wyczyszczenia do użytku na żywo !
W tym przykładzie jest uruchamiany z katalogu znajdującego się w głównym folderze www / public_html. Aby dostać się do katalogu głównego, wystarczy podróżować w górę o jeden folder.
<?php
$pathBase = '../';
$zipPREFIX = "sitename_www";
$zipDATING = '_' . date('Y_m_d') . '_';
$zipPOSTFIX = "backup";
$zipEXTENSION = ".zip";
ini_set('display_errors',1);
ini_set('display_startup_errors',1);
error_reporting(-1);
$iBaseLen = strlen($pathBase);
$iPreLen = strlen($zipPREFIX);
$iPostLen = strlen($zipPOSTFIX);
$sFileZip = $pathBase . $zipPREFIX . $zipDATING . $zipPOSTFIX . $zipEXTENSION;
$oFiles = array();
$oFiles_Error = array();
$oFiles_Previous = array();
echo '<center><h2>PHP Example: ZipArchive - Mayhem</h2></center>';
if (file_exists($sFileZip)) {
echo "<h3 style='margin-bottom:0px;'>Backup Already Exists</h3><div style='width:800px; border:1px solid #000;'>";
echo '<b>File Name: </b>',$sFileZip,'<br />';
echo '<b>File Size: </b>',$sFileZip,'<br />';
echo "</div>";
exit;
} else {
echo "<h3 style='margin-bottom:0px;'>Script Settings</h3><div style='width:800px; border:1px solid #000;'>";
echo '<b>Backup Directory: </b>',$pathBase,'<br /> ';
echo '<b>Backup Save File: </b>',$sFileZip,'<br />';
echo "</div>";
$oZip = new ZipArchive;
$oZip->open($sFileZip, ZipArchive::CREATE | ZipArchive::OVERWRITE);
$oFilesWrk = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($pathBase),RecursiveIteratorIterator::LEAVES_ONLY);
foreach ($oFilesWrk as $oKey => $eFileWrk) {
$sFilePath = substr($eFileWrk->getPathname(),$iBaseLen, strlen($eFileWrk->getPathname())- $iBaseLen);
$sFileReal = $eFileWrk->getRealPath();
$sFile = $eFileWrk->getBasename();
$sMyFP = str_replace('\\', '/', $sFileReal);
if (file_exists($sMyFP)) {
if ($sFile!="." && $sFile!="..") {
if (substr($sFile,0, $iPreLen)!=$zipPREFIX && substr($sFile,-1, $iPostLen + 4)!= $zipPOSTFIX.$zipEXTENSION) {
$oFiles[] = $sMyFP;
$oZip->addFile($sMyFP, $sFilePath);
} else {
$oFiles_Previous[] = $sMyFP;
}
}
} else {
$oFiles_Error[] = $sMyFP;
}
}
$sZipStatus = $oZip->getStatusString();
$oZip->close();
echo "<h3 style='margin-bottom:0px;'>Backup Stats</h3><div style='width:800px; height:120px; border:1px solid #000;'>";
echo "<b>Zipper Status: </b>" . $sZipStatus . "<br />";
echo "<b>Finished Zip Script: </b>",$sFileZip,"<br />";
echo "<b>Zip Size: </b>",human_filesize($sFileZip),"<br />";
echo "</div>";
echo "<h3 style='margin-bottom:0px;'>Previous Backups Count(" . count($oFiles_Previous) . ")</h3><div style='overflow:auto; width:800px; height:120px; border:1px solid #000;'>";
foreach ($oFiles_Previous as $eFile) {
echo basename($eFile) . ", Size: " . human_filesize($eFile) . "<br />";
}
echo "</div>";
if (count($oFiles_Error)>0) {
echo "<h3 style='margin-bottom:0px;'>Error Files, Count(" . count($oFiles_Error) . ")</h3><div style='overflow:auto; width:800px; height:120px; border:1px solid #000;'>";
foreach ($oFiles_Error as $eFile) {
echo $eFile . "<br />";
}
echo "</div>";
}
echo "<h3 style='margin-bottom:0px;'>Added Files, Count(" . count($oFiles) . ")</h3><div style='overflow:auto; width:800px; height:120px; border:1px solid #000;'>";
foreach ($oFiles as $eFile) {
echo $eFile . "<br />";
}
echo "</div>";
}
function human_filesize($sFile, $decimals = 2) {
$bytes = filesize($sFile);
$sz = 'BKMGTP';
$factor = floor((strlen($bytes) - 1) / 3);
return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor];
}
?>
CO TO ROBI??
Po prostu spakuje całą zawartość zmiennej $ pathBase i zapisze zip w tym samym folderze. Wykonuje proste wykrywanie poprzednich kopii zapasowych i pomija je.
BACKUP CRON
Ten skrypt, który właśnie przetestowałem na Linuksie i działał dobrze z pracą cron z użyciem bezwzględnego adresu URL dla pathBase.