PHP ZipArchive Sınıfı
PHP'nin içerisinde hazır gelen ZipArchive sınıfını kullanarak kolayca istediğiniz dosya ve klasörleri sıkıştırabilir ve istediğiniz bir konuma kolayca kaydedebilirsiniz. Açıkçası hazırlamış olduğum ve sizlerle paylaştığım bu fonksiyonu ben
Windows ortamında kullanıyorum ve hem script dosyalarını hemde veritabanı dosyalarını sıkıştırarak iki farklı yere yedekleme yapıyorum. Yedekleme yaptığım dizinlerden biri bilgisayarımdaki farklı bir disk, diğeri ise Google Drive klasörü,
Google Drive klasörüne yedekleme yaparak
bulut teknolojisi'nden de yararlanmış oluyorum. Bu fonksiyonu
Linux sunucunuzda da kullanabilirsiniz, ancak veritabanı dosyalarını saf haliyle sıkıştıramayabilirsiniz. Eğer bu fonksiyonu Linux ortamında kullanmayı planlıyor ve veritabanınıda sıkıştırarak yedeklemek istiyorsanız öncelikle veritabanını ".sql" uzantılı bir dosya olarak yedeklemeniz gerekmekte.
Hazırlamış olduğum bu fonksiyonun pek çok özelliği bulunuyor, bunlardan biri istediğiniz sayıda farklı dizini sıkıştırarak her birini birden çok yere kaydedebilirsiniz. Bir diğer özelliğide sıkıştırmış olduğunuz dosyaları şifreleyebilmeniz, ancak bu şifreleme için minimum PHP 7.2 sürümü kullanıyor olmanız gerekiyor.
Sıkıştırma İşlemi Yapan PHP Fonksiyonu
ini_set('max_execution_time', 9999);
ini_set('memory_limit','2048M');
define('YEDEKLEME_SERVISI', true);
/*** ################################################################################ ***/
function diziAra($aranan, $aranan_yer)
{
foreach ($aranan_yer as $deger)
{
if (($deger === $aranan)) return true;
elseif(is_array($deger))
{
$sonuc = diziAra($aranan, $deger);
if($sonuc == true) return true;
}
}
return false;
}
/*** ################################################################################ ***/
function NTGYedeklemeServisi($yedeklenecekler)
{
$input = array();
$say = 1;
if (extension_loaded('zip'))
{
if((is_array($yedeklenecekler)) AND (count($yedeklenecekler) > 0))
{
foreach($yedeklenecekler as $yedeklenecek)
{
echo '<hr /><p>'.$yedeklenecek['dizin'].'</p>';
if (file_exists($yedeklenecek['dizin']))
{
$dizin = realpath($yedeklenecek['dizin']);
$zip = new ZipArchive();
if((is_array($yedeklenecek['yedekle'])) AND (count($yedeklenecek['yedekle']) > 0))
{
foreach($yedeklenecek['yedekle'] as $zipDosyasi)
{
if(file_exists($zipDosyasi)) unlink($zipDosyasi);
if ($zip->open($zipDosyasi, ZIPARCHIVE::CREATE))
{
if (is_dir($dizin))
{
$dosyalar = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dizin), RecursiveIteratorIterator::SELF_FIRST);
foreach ($dosyalar as $dosya)
{
$dosya = realpath($dosya);
if (is_file($dosya))
{
if((realpath($_SERVER['SCRIPT_FILENAME']) != $dosya) AND (!diziAra($dosya, $yedeklenecekler)))
{
echo '<p style="padding:0; margin:0;"><strong>Yedekleniyor ['.$say.'] : </strong>'.$dosya.'</p>';
$dosyaEkle = @trim(str_replace('\\', '/', end(explode(end(explode('\\', $dizin)), $dosya))), '/');
$zip->setPassword($yedeklenecek['sifre']);
$zip->addFile($dosya, $dosyaEkle);
if (version_compare(phpversion(), '7.1', '>')) $zip->setEncryptionIndex($dosyaEkle, ZipArchive::EM_AES_256);
$say++;
}
}
}
}
if($yedeklenecek['input'] == true) $input[] = $zipDosyasi;
}
}
}
$zip->close();
}
}
}
}
echo '<hr />';
if(count($input) > 0) foreach($input as $inputDosya) if(file_exists($inputDosya)) echo '<p><input value="'.$inputDosya.'" style="width:500px;" /></p>';
echo '<hr /><p>Yedekleme Bitti...<p><hr />';
}
Kullanım şekli:
NTGYedeklemeServisi(array(
array(
'dizin' => 'C:\AppServ\MySQL\data\veritabani',
'yedekle' => array(
'A:\NTGYedek\veritabani.zip',
'D:\veritabani.zip',
'C:\GoogleDrive\veritabani.zip'
),
'input' => true,
'sifre' => '123456'
),
array(
'dizin' => 'C:\AppServ\www\site',
'yedekle' => array(
'A:\NTGYedek\site.zip',
'D:\site.zip',
'C:\GoogleDrive\site.zip'
),
'input' => false,
'sifre' => '123456'
)
));