2010-02-07 5 views
7

J'ai écrit un système de gestion de contenu de base pour mon site Web, y compris un panneau d'administration. Je comprends le fichier IO de base ainsi que la copie via PHP, mais mes tentatives d'écriture d'un script de sauvegarde du script ont échoué. J'ai essayé de faire ceci:PHP Script de sauvegarde récursive

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

Mais cela n'a pas semblé fonctionner.

Je sais que je peux le faire en utilisant FTP, mais je veux une solution complètement côté serveur qui peut être accessible n'importe où avec une autorisation suffisante.

+2

C'est étrange, je suis travaillant sur exactement le même problème en ce moment, et j'ai posé presque la même question il y a une minute :) Je l'ai supprimé, cependant, parce que j'ai reçu une bonne question existante: http://stackoverflow.com/questions/1334613/zip -a-directory-in-php –

+0

Je suis surpris que personne n'ait mentionné DirectoryIterator pour l'obtention de vos fichiers. – Chris

Répondre

9

Voici une alternative bien: pourquoi n'est-ce pas 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; 
} 

Vous pouvez même décompresser après et archiver le même effet, mais je dois dire que je préfère avoir mes sauvegardes compressées au format de fichier zip.

2

Vous pouvez utiliser la récursivité.

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

si vous avez accès à exécuter le fichier binaire tar par la fonction exec, il serait plus rapide et mieux je pense:

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

ou

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

juste une simple correction: exec ('tar -zcvf backup.gzip'. Realpath ('un répertoire'). '/ *'); salutations – Michelangelo

2

vous l'avez presque tout

$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() est meilleur que scandir() en raison de plus une production constante

1

Je nous quelque chose appelé UPHP. Appelez simplement le zip() pour le faire. ici:

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

UPHP est une bibliothèque PHP. Téléchargement: here

+0

le lien ne fonctionne pas –

0

i utiliser une fonction simple pour sauvegarder un fichier:

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

echo 'Backup is Completed'; 
?> 
Questions connexes