PHP Recursive Yedekleme Komut

7 Cevap php

Ben bir yönetim paneli dahil benim web sitesi için temel bir içerik yönetim sistemi, yazdı. Ben PHP ile temel dosya IO yanı sıra kopyalama anlıyorum, ancak komut dosyası çağrılabilir bir yedekleme komut benim girişimleri başarısız oldu. Ben bunu denedim:

//... authentication, other functions
for(scandir($homedir) as $buffer){
    if(is_dir($buffer)){
        //Add $buffer to an array
    }
    else{
        //Back up the file
    }
}
for($founddirectories as $dir){
    for(scandir($dir) as $b){
        //Backup as above, adding to $founddirectories
    }
}

Ama işe görünmüyordu.

Ben FTP kullanarak bunu biliyorum, ama ben yeterli yetki ile her yerde erişilebilir tamamen sunucu tarafı çözüm istiyoruz.

7 Cevap

İşte bir alternatif olsa: neden yok değil Zip the source directory instead?

function Zip($source, $destination)
{
    if (extension_loaded('zip') === true)
    {
        if (file_exists($source) === true)
        {
            $zip = new ZipArchive();

            if ($zip->open($destination, ZIPARCHIVE::CREATE) === true)
            {
                $source = realpath($source);

                if (is_dir($source) === true)
                {
                    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);

                    foreach ($files as $file)
                    {
                        $file = realpath($file);

                        if (is_dir($file) === true)
                        {
                            $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
                        }

                        else if (is_file($file) === true)
                        {
                            $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
                        }
                    }
                }

                else if (is_file($source) === true)
                {
                    $zip->addFromString(basename($source), file_get_contents($source));
                }
            }

            return $zip->close();
        }
    }

    return false;
}

Ben zip dosyası formatında sıkıştırılmış benim yedekleri olan tercih söylemek gerekir, ancak sen bile, sonradan onu halletmek ve aynı etkiyi arşivleyebilirsiniz.

Eğer exec fonksiyonu sayesinde tar ikili dosyayı yürütmek için erişiminiz varsa, daha hızlı ve daha iyi sanırım olacaktır:

exec('tar -zcvf ' . realpath('some directveyay') .'/*);

veya

chdir('some directveyay')
exec('tar -zcvf ./*');

Sen özyineleme kullanabilirsiniz.

for(scandir($dir) as $dir_contents){
    if(is_dir($dir_contents)){
        backup($dir_contents);
    }else{
        //back up the file
    }
}

Eğer neredeyse doğru var

$dirs = array($homedir);
$files = array();

while(count($dirs)) {
   $dir = array_shift($dirs);
   foreach(glob("$dir/*") as $e)
      if(is_dir($e)) 
         $dirs[] = $e;
      else
         $files[] = $e;
}
// here $files[] contains all files from $homedir and below

glob () çünkü daha tutarlı çıkış () scandir daha iyidir

Ben bize UPHP şey denir. Sadece zip() bunu diyoruz. burada:

<?php
    include "uphplib.php";
    $folder = "data";
    $dest = "backup/backup.zip";
    zip($folder, $dest);
?>

UPHP bir PHP kütüphanesidir. indir: here

i yedek dosya için basit bir işlevini kullanın:

<?php
$oldfile = 'myfile.php';
$newfile = 'backuped.php';
copy($oldfile, $newfile) or die("Unable to backup");

echo 'Backup is Completed';
?>

Burada, ftp, mysqldump pg_dump ve dosya sistemi yetenekleri ile bir yedek script https://github.com/skywebro/php-backup