【问题标题】:PHP Recursive Backup ScriptPHP 递归备份脚本
【发布时间】:2011-01-14 03:46:14
【问题描述】:

我为我的网站编写了一个基本的内容管理系统,包括一个管理面板。我了解基本文件 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 来做到这一点,但我想要一个完全服务器端的解决方案,只要有足够的授权就可以在任何地方访问。

【问题讨论】:

  • 这太可怕了,我现在正在研究完全相同的问题,一分钟前我问了几乎相同的问题:) 不过我删除了它,因为我得到了一个很好的现有问题:stackoverflow.com/questions/1334613/zip-a-directory-in-php
  • 我很惊讶没有人提到 DirectoryIterator 来获取你的文件。

标签: php backup


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 只是一个简单的更正: exec('tar -zcvf backup.gzip ' .realpath('some directory') .'/*');问候
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      我使用了一种叫做 UPHP 的东西。只需致电zip() 即可。这里:

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

      UPHP 是一个 PHP 库。下载:here

      【讨论】:

        【解决方案5】:

        这里有一个替代方案:你为什么不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 文件格式。

        【讨论】:

          【解决方案6】:

          你猜对了

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

          【讨论】:

            【解决方案7】:

            你可以使用递归。

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-08-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-09-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多