PHP递归备份脚本

时间:2010-02-07 20:02:40

标签: php backup

我为我的网站编写了一个基本的内容管理系统,包括一个管理面板。我理解基本文件IO以及通过PHP进行复制,但是我对从脚本调用的备份脚本的尝试失败了。我试过这样做:

//... 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
    }
}

但它似乎没有用。

我知道我可以使用FTP做到这一点,但我想要一个完全服务器端的解决方案,只要有足够的授权就可以在任何地方访问。

7 个答案:

答案 0 :(得分:9)

这是另一种选择:你为什么不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;
}

您甚至可以将其解压缩并存档相同的效果,但我必须说我更喜欢以zip文件格式压缩我的备份。

答案 1 :(得分:4)

如果你有权通过exec函数执行tar二进制文件,我认为它会更快更好:

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

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

答案 2 :(得分:2)

您可以使用递归。

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

答案 3 :(得分:2)

你得到的几乎是正确的

$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()比scandir()更好,因为输出更加一致

答案 4 :(得分:1)

我称之为UPHP。只需致电zip()即可。这里:

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

UPHP是一个PHP库。下载:here

答案 5 :(得分:1)

这是一个备份脚本,包含ftp,scp,mysqldump,pg_dump和文件系统功能https://github.com/skywebro/php-backup

答案 6 :(得分:0)

我使用一个简单的函数来备份文件:

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

echo 'Backup is Completed';
?>