2010-02-07 15 views
7

Ho scritto un sistema di gestione dei contenuti di base per il mio sito Web, incluso un pannello di amministrazione. Comprendo il file di base IO e copiando tramite PHP, ma i tentativi di script di backup richiamabili dallo script non sono riusciti. Ho provato a fare questo:Script di backup ricorsivo 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 
    } 
} 

Ma non sembra funzionare.

So che posso farlo tramite FTP, ma voglio una soluzione completamente lato server a cui sia possibile accedere ovunque con sufficiente autorizzazione.

+2

Questo è inquietante, io sono lavorando esattamente sullo stesso problema al momento, e ho chiesto quasi la stessa domanda un minuto fa :) L'ho cancellato, però, perché mi è stata fornita una buona domanda esistente: http://stackoverflow.com/questions/1334613/zip -a-directory-in-php –

+0

Sono sorpreso che nessuno abbia menzionato DirectoryIterator per ottenere i tuoi file. – Chris

risposta

9

Ecco un'alternativa però: perché non sei 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; 
} 

si può anche decomprimere dopo e archiviare lo stesso effetto, anche se devo dire che preferisco avere il mio backup compressi in formato zip.

2

È possibile utilizzare la ricorsione.

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

se si ha accesso ad eseguire il file binario tar attraverso la funzione exec sarebbe più veloce e meglio credo:

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

o

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

solo una semplice correzione: exec ('tar -zcvf backup.gzip'. Realpath ('qualche directory'). '/ *'); saluti – Michelangelo

2

avete capito quasi subito

$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() è meglio di scandir() a causa della produzione più consistente

1

ho noi qualcosa chiamato UPHP. Basta chiamare lo zip() per farlo. qui:

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

UPHP è una libreria PHP. scaricare: here

+0

link non funziona –

0

Io uso una semplice funzione per il backup di un file:

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

echo 'Backup is Completed'; 
?>