PHP – MyZipBackup: Script in php per backup ricorsivo del proprio sito web

Qualche giorno fa, in una discussione su AlterVista forum, un utente chiedeva uno script in php per creare dei backup del proprio sito web.

AlterVista ha già un suo servizio backup, ma si tratta di un servizio “a pagamento” (tramite gli altercent) e il backup serve solo come ripristino in tale data, quindi non è accessibile, per esempio, nel caso in cui si voglia recuperare un solo file cancellato o modificato per errore.

A causa di ciò, ad alcuni non piace, e da qui la richiesta di uno script “alternativo”.

Così, tempo permettendo, mi ci sono dedicato…

Bisogna dire che lo script base – trovato dopo varie ricerche – viene da stackoverflow, ed è proprio l’unico con zero voti: stackoverflow.com/…/how-to-zip-a-whole-folder-using-php/ 😆

Però mi piaceva il fatto che avesse una bozza di interfaccia… Insomma, ci vedevo un discreto potenziale!

Così, dopo le dovute prove, correzioni, migliorie, varie ed eventuali, ecco che adesso ho uno script che crea un backup ricorsivo, lo archivia in formato zip, e per 24ore evita che possano esserne creati altri!

Inoltre il nome del file ha un algoritmo complesso in md5 (ben più sicuro dello script originale), così da evitare facili accessi esterni.

E dalla generazione dell’archivio, ovviamente, vengono esclusi i backup precedenti 😉

Il file l’ho testato su altervista, per questo contiene l’esempio di configurazione per altervista.

Su altri server, solitamente, avremmo: /home/username/public_html/

<?php

// SHOW PHP ERRORS... REMOVE/CHANGE FOR LIVE USE
#ini_set('display_errors',1);
#ini_set('display_startup_errors',1);
#error_reporting(-1);

/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
                                        #
# Config Start 🙂                       @
// DIRECTORY WE WANT TO BACKUP          @
$directory_path = '/membri/darkwolf/';  #
$backup_directory = '.backup_here/';    #
# Config End 😛                         @
                                        #
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/


// Do no edit from here!!!

// ZIP FILE NAMING ... This currently is equal to ".website_ext_bkk_YYYYMMDD_encryptedlongkey.zip"
$checkvar = sha1(md5($directory_path.date("Ymd").$backup_directory.$_SERVER['SERVER_NAME'])); // Check Var - if(file_exists) - With Security sha1>Md5
$archive_name = ".".str_replace(".", "_", $_SERVER['SERVER_NAME'])."_bkk_" . date("Ymd") . "_" . $checkvar .".zip";
/*

explain:
start with dot (hidden file);
str_replace dot with underscore in SERVER_NAME
_bkk_
long date
another underscore
checkvar (long, strong and unique sha1>md5 key)!
.zip (file extension).

eg: .darkwolf_altervista_org_bkk_20160603_6d4c583bddc008972f9611a319e928cf001d7896.zip

*/


// SOME BASE VARIABLES WE MIGHT NEED
$bkk_file = $directory_path . $backup_directory . $archive_name;
$files = array();
$files_previous = array();

// SIMPLE HEADER 😉
echo '<h1>PHP - MyZipBackup</h1>';

// CHECK IF BACKUP ALREADY DONE
if (file_exists($bkk_file))
{
	// IF BACKUP EXISTS... SHOW MESSAGE AND THATS IT
	echo "
	<h2>Backup Already Exists</h2>
	<div style='border: 1px dotted #000; padding: 5px;'>
	<p>
		<b>File Name:</b> <a href=" . basename($bkk_file) . ">" . basename($bkk_file) . "</a>
	</p>
	<p>
		<b>File Size:</b> " . human_filesize($bkk_file) . "
	</p>		
	</div>";
}
else
{
	// NO BACKUP FOR TODAY.. SO START IT AND SHOW SCRIPT SETTINGS
	echo "
	<h2>Script Settings</h2>
	<div style='border: 1px dotted #000; padding: 5px;'>
	<p>
		<b>Backup Directory:</b> " . $directory_path . $backup_directory . "
	</p>
	<p>
		<b>Backup Save File:</b> <a href=" . basename($bkk_file) . ">" . basename($bkk_file) . "</a>
	</p>";
	// CREATE ZIPPER AND LOOP DIRECTORY FOR SUB STUFF
	$zip = new ZipArchive;
	$zip->open($bkk_file,  ZipArchive::CREATE | ZipArchive::OVERWRITE);
	$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory_path),RecursiveIteratorIterator::LEAVES_ONLY);
	foreach ($iterator as $iter => $files_work)
	{
		// VARIOUS NAMING FORMATS OF THE CURRENT FILE / DIRECTORY.. RELATE & ABSOLUTE
		$filep = str_replace($directory_path, '', $files_work->getPathname());
		$fileb = $files_work->getBasename();
		// WINDOWS CORRECT SLASHES
		$filerp = str_replace('\\', '/', $files_work->getRealPath());
		
		// CHECK IF THE FILE WE ARE LOOPING EXISTS
		if (!empty($filerp) && $fileb != "." && $fileb != "..")
		{ // MAKE SURE NOT DIRECTORY / . || ..
			// CHECK IF FILE HAS BACKUP NAME PREFIX/POSTFIX... If So, Dont Add It,, List It
			if (!preg_match("/.zip/", $fileb))
			{
				$files[] = $filerp;
				$zip->addFile($filerp, $filep);
			}
			else
			{
				$files_previous[] = $filerp;
			}
		}
	}
	$zip_status = $zip->getStatusString(); // GET ZIP STATUS
	$zip->close(); // WARNING: Close Required to append files, dont delete any files before this.
	// SHOW BACKUP STATUS / FILE INFO + SHOW ANY FILES THAT HAVE BEEN ADDED TO THE ZIP + ANY PREVIOUS BACKUP FILES
	echo "
	<p>
		<b>Status: </b>" . $zip_status . "
	</p>
	<p>		
		<b>Size: </b>" . human_filesize($bkk_file) . "
	</p>
	</div>
	<h3>Added Files, Count(" . count($files) . ")</h3>
	<div style='overflow: auto; height: 120px; border: 1px dotted #000;'>
	<pre>";
	foreach ($files as $file)
	{
		echo ((end($files) !== $file) ? $file."\n" : $file);
	}
	echo "</pre>
	</div>
	<h3>Previous Backups Count(" . count($files_previous) . ")</h3>
	<div style='overflow: auto; height: 120px; border: 1px dotted #000; padding: 5px;'>";
	foreach ($files_previous as $file)
	{
		echo "<a href=" . basename($file) . ">" . basename($file) . "</a>, Size: " . human_filesize($file) . "<br />";
	}
	echo "
	</div>";
}

// CONVERT FILENAME INTO A FILESIZE AS Bytes/Kilobytes/Megabytes,Giga,Tera,Peta
function human_filesize($fileb, $decimals = 2)
{
	$bytes = filesize($fileb);
	$sz = 'BKMGTP';
	$factor = floor((strlen($bytes) - 1) / 3);
	return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor];
}

?>

Probabilmente migliorabile, ma funziona a dovere e se richiamato periodicamente tramite cron… beh, ecco che ci siam fatti un ottimo servizio di backup del nostro spazio web “gratis” 😛

Come usarlo?

  1. Basta metterlo in un file! Ad esempio: _miobackupolatro.php
  2. Quindi ci sono da impostare giusto quei due parametri: $directory_path e $backup_directory
  3. Infine – consiglio – inserirlo dentro la stessa directory che ospiterà i backup (creiamola prima, con i permessi corretti, e meglio se nascosta e protetta con htaccess). Ad esempio: .root_backup

Se avete fatto questi tre passaggi in modo corretto, basterà andare su:
vostrosito.xx/.root_backup/_miobackupoaltro.php
ed ecco che verrà eseguito il primo backup dell’intero sito.


io, in questo caso, avevo già altri backup – ma eran più vecchi di 24ore, quindi lo ha eseguito…

make_bkk

ci ho riprovato poco dopo, ed ecco cosa accade:

exist

questo ciò che ritrovo nell’ftp:

on_server

Che ne pensate? Vi piace? 🙂

Io, avendo cpanel con backup automatico qui su laltroweb, non lo userò, lo ammetto, ma in altre circostanze potrebbe farmi molto comodo, quindi archivio!




Lascia un commento