2010-02-07 15 views
7

Escribí un sistema básico de administración de contenido para mi sitio web, incluido un panel de administración. Comprendo el archivo IO básico y la copia a través de PHP, pero mis intentos de realizar un script de respaldo invocable desde el script han fallado. Intenté hacer esto:PHP Recursive Backup Script

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

Pero no parecía funcionar.

Sé que puedo hacer esto mediante FTP, pero quiero una solución completamente del lado del servidor a la que se pueda acceder en cualquier lugar con suficiente autorización.

+2

Esto es inquietante, yo soy trabajando exactamente en el mismo problema en este momento, y le hice casi la misma pregunta hace un minuto :) Lo eliminé, sin embargo, porque me dieron una buena pregunta existente: http://stackoverflow.com/questions/1334613/zip -a-directory-in-php –

+0

Me sorprende que nadie haya mencionado DirectoryIterator para obtener sus archivos. – Chris

Respuesta

9

Aquí es una alternativa sin embargo: ¿por qué ¿No es 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; 
} 

incluso pueden descomprimirlo después y archivar el mismo efecto, aunque hay que decir que prefiero tener mis copias de seguridad comprimidas en formato zip.

2

Puede usar recursividad.

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

si tiene acceso para ejecutar el archivo binario de alquitrán a través de la función exec que sería más rápido y mejor que pienso:

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

o

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

solo una corrección simple: exec ('tar -zcvf backup.gzip'. Realpath ('some directory'). '/ *'); saludos – Michelangelo

2

lo tienes casi justo

$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() es mejor que scandir() a causa de la producción más consistente

1

que nosotros algo que se llama UPHP. Simplemente llame al zip() para hacer eso. aquí:

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

UPHP es una biblioteca de PHP. Descarga: here

+0

el enlace no funciona –

0

i utilizar una simple función de copia de seguridad de un archivo:

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

echo 'Backup is Completed'; 
?>