Foros del Web » Programando para Internet » PHP »

Copiar Todo El Contenido De Una Carpeta A Otra, Unix

Estas en el tema de Copiar Todo El Contenido De Una Carpeta A Otra, Unix en el foro de PHP en Foros del Web. Hola amigos, me encuentro en un problema que parece no tener fin... Estoy desarrollando un sistema para respaldar la información de mi servidor de una ...
  #1 (permalink)  
Antiguo 09/06/2008, 22:03
Avatar de marcosr  
Fecha de Ingreso: agosto-2005
Ubicación: Montevideo, Uruguay
Mensajes: 451
Antigüedad: 18 años, 8 meses
Puntos: 5
Copiar Todo El Contenido De Una Carpeta A Otra, Unix

Hola amigos, me encuentro en un problema que parece no tener fin...

Estoy desarrollando un sistema para respaldar la información de mi servidor de una forma que tendría que ser fácil y rápida pero me encuentro con una gran piedra en el camino y es copiar carpetas enteras.

Yo tengo un servidor UNIX ("doméstico") y tengo los ficheros de apache (osea los scripts PHP) en /var/www/ mientras que los datos mysql y otra información importante se encuentran en /home/, las dos carpetas están muy lejos, y ninguna pertenece a la otra. Es por esto que se me ocurrió (no pregunten por qué) hacer que la carpeta /home/ se copie a /var/www/home/ temporalmente (hasta respaldar) para luego ser eliminada de este directorio, esto porque el script que genera archivos zip (que luego descargo), por algun motivo no puede ir a carpetas que se encuentran fuera del directorio www.

Este script tiene algún problema o es solo que tampoco para copiar puedo ir a directorios inferiores?
Código PHP:
$dstdir "home/";
        
$srcdir "/home/";
        
        if (!
is_dir($srcdir)) { echo "No existe el directorio BASE, un grave error puede estar ocurriendo, contacte al administrador.";  exit; }
        
        
$verbose true;
    
          if(!
is_dir($dstdir)) mkdir($dstdir);
          if(
$curdir opendir($srcdir)) {
            while(
$file readdir($curdir)) {
              if(
$file != '.' && $file != '..') {
                
$srcfile $srcdir '\\' $file;
                
$dstfile $dstdir '\\' $file;
                if(
is_file($srcfile)) {
                  if(
is_file($dstfile)) $ow filemtime($srcfile) - filemtime($dstfile); else $ow 1;
                  if(
$ow 0) {
                    if(
$verbose) echo "Copying '$srcfile' to '$dstfile'...";
                    if(
copy($srcfile$dstfile)) {
                      
touch($dstfilefilemtime($srcfile)); $num++;
                      if(
$verbose) echo "OK\n";
                    }
                    else echo 
"Error: File '$srcfile' could not be copied!\n";
                  }                  
                }
                else if(
is_dir($srcfile)) {
                  
$num += dircopy($srcfile$dstfile$verbose);
                }
              }
            }
            
closedir($curdir);
          } 
Saludos y muchas gracias de antemano !

P.D.: Existe alguna otra forma de respaldar más rápidamente que yo desconozca y este por esto "perdiendo el tiempo"?
__________________
Yo hago preguntas inteligentes para obtener respuestas rapidas, y vos?
(únete a la campaña !)
  #2 (permalink)  
Antiguo 09/06/2008, 22:29
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Copiar Todo El Contenido De Una Carpeta A Otra, Unix

ya te diste cuenta que usas backslash \\ en ves de slash /

estas trabajando con *nix o Windows, decídete.... suerte!

PDTA: sugiero que si usas una clase para respaldar en ZIP, le des la ruta real... no hay necesidad de hacer una copia
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 10/06/2008, 20:23
Avatar de marcosr  
Fecha de Ingreso: agosto-2005
Ubicación: Montevideo, Uruguay
Mensajes: 451
Antigüedad: 18 años, 8 meses
Puntos: 5
Respuesta: Copiar Todo El Contenido De Una Carpeta A Otra, Unix

Muchas gracias por tu respuesta y disculpas por no haber contestado antes pero es que tuve un día muy complicado...

Muy bien, ocurre que no me había percatado de eso, realmente me ha hecho dar unos pasos adelante pero aún no puedo conseguir lo que deseo, ahora ocurre que el error de memoria insuficiente se aparece, para evitar que este error ocurra se me ha ocurrido que en vez de solicitar a PHP que genere el archivo, por qué no hacer que directamente el equipo lo genere mediante el comando "tar" de Ubuntu. Ahora surge la duda de como hacer que PHP corra un ejecutable UNIX, estoy leyendo algo de la función exec() pero ya veo que esto me va a llevar un buen tiempo de lectura....

Si alguien me sabe ayudar bienvenido sea !

__________________
Yo hago preguntas inteligentes para obtener respuestas rapidas, y vos?
(únete a la campaña !)
  #4 (permalink)  
Antiguo 11/06/2008, 01:12
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 8 meses
Puntos: 102
Respuesta: Copiar Todo El Contenido De Una Carpeta A Otra, Unix

Cita:
Iniciado por marcosr Ver Mensaje
[...] por qué no hacer que directamente el equipo lo genere mediante el comando "tar" de Ubuntu.
Querrás decir mediante el programa tar de entornos *nix. Es parte del proyecto GNU.
www.gnu.org/software/tar/


Cita:
Iniciado por marcosr Ver Mensaje
Ahora surge la duda de como hacer que PHP corra un ejecutable UNIX.
Pues con exec() como bien mencionas. Pregunta: ¿y no puedes ejecutar un mv de igual manera?... y si es tu servidor, ¿no puedes hacerlo manualmente? ¿por qué no script en Bash?... ¿por qué PHP? (perdón por preguntar ), creo que estarías perdiendo tiempo sin una buena justificación (siendo tu servidor).

Perdón, no veo tu código como para decirte algo. Suerte
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #5 (permalink)  
Antiguo 11/06/2008, 14:15
Avatar de marcosr  
Fecha de Ingreso: agosto-2005
Ubicación: Montevideo, Uruguay
Mensajes: 451
Antigüedad: 18 años, 8 meses
Puntos: 5
Respuesta: Copiar Todo El Contenido De Una Carpeta A Otra, Unix

Desconozco por qué agregan el asterisco (*) delante del nix, que otras variantes a UNIX existen? Disculpen mi ignorancia...

Lo quiero hacer con PHP porque estoy desarrollando el programa en mi servidor doméstico pero en realidad la idea es cargarlo en el servidor de la empresa de un conocido que desea porder respaldar y poseer consigo mismo los datos del servidor de datos (almacenan información de todos los equipos de la empresa allí). Está en mis planes incluso realizar este script para poder cargarlo en cualquier servidor que lo requiera, por esto lo quiero hacer general. También olvidé mensionar que lo hago en PHP para correrlo en Apache y que de este modo las personas que realizan el respaldo, lo descarguen mediante el explorador directamente a sus equipos a pesar de que ninguno de ellos sabe manejar *nix, al menos desde la línea de comandos.

Dejo aquí el código que genera el tar (pero como script PHP, no como ejecutable *nix):

Código PHP:
function createzip($struct,$namezip=0)
    {     
$ZipData = array(); 
        
$Dircont = array(); 
        
$DirFile = array();
        
$offseto 0;        
        while(list(
$file,$data)=each($struct))
        {    
$filestr_replace("\\""/"$file);  
            
$dir=explode("/",$file);
            for(
$i=0$i<sizeof($dir); $i++)if($dir[$i]=="")unset($dir[$i]);                    
            
$num=count($dir); //Total de niveles
            
$ele=0;            //Nivel actual
            
$dirname="";      //Nombre archivo o directorio
            
while(list($idx,$val)=each($dir))
            {    
$ty=(++$ele)==$num?true:false;
                
$ty=trim($data)!=""?$ty:false;//Compruebar si el ultimo elemento es directorio o archivo
                
$dirname.=$val.($ty?"":"/");
                if(isset(
$DirFile[$dirname]))continue; else $DirFile[$dirname]=true;            
                
$gzdata="";                
                if(
$ty)
                {    
$unziplen=strlen($data);  
                    
$czip=crc32($data);  
                    
$gzdata=gzcompress($data);  
                    
$gzdata=substr(substr($gzdata,0,strlen($gzdata)-4),2); 
                    
$cziplen=strlen($gzdata);  
                }                        
                
$ZipData[]="\x50\x4b\x03\x04".($ty?"\x14":"\x0a")."\x00\x00\x00".($ty?"\x08":"\x00")."\x00\x00\x00\x00\x00".
                           
pack("V",$ty?$czip:0).pack("V",$ty?$cziplen:0).pack("V",$ty?$unziplen:0).pack("v",strlen($dirname)). 
                           
pack("v",0).$dirname.$gzdata.pack("V",$ty?$czip:0).pack("V",$ty?$cziplen:0).pack("V",$ty?$unziplen:0);
                
$Dircont[]="\x50\x4b\x01\x02\x00\x00".($ty?"\x14":"\x0a")."\x00\x00\x00".($ty?"\x08":"\x00")."\x00\x00\x00\x00\x00".
                           
pack("V",$ty?$czip:0).pack("V",$ty?$cziplen:0).pack("V",$ty?$unziplen:0).pack("v",strlen($dirname)). 
                           
pack("v").pack("v",0).pack("v",0).pack("v",0).pack("V",$ty?32:16).pack("V",$offseto).$dirname;          
                
$offseto=strlen(implode("",$ZipData));            
            }
//Fin While dir        
        
}//Fin While archivos
        
$data implode("",$ZipData);  
        
$cdir implode("",$Dircont);      
        
$data=$data.$cdir."\x50\x4b\x05\x06\x00\x00\x00\x00".pack("v",sizeof($Dircont)).pack("v",sizeof($Dircont)).pack("V",strlen($cdir)).pack("V",strlen($data))."\x00\x00";
        if(
$namezip)//Construir el archivo
        
{    if(($fp=fopen($namezip,"wb")))
               {    
fwrite($fp,$data);
                
fclose ($fp);
                return 
true;
            }else return 
false;
        }else return 
$data;       
    }
    
    function 
fun_dir($dir,&$A,$path=0)
    { 
$d dir($dir);
      
$path=$path?$path:$dir;
      while(
$df=$d->read()) 
      { if(
$df=="." || $df=="..")continue;
        if(
is_file($d->path.$df))
         { 
$A[str_replace($path,"",$d->path.$df)]=file_get_contents($d->path.$df);
         }
        else 
         { 
$A[str_replace($path,"",$d->path.$df)."/"]=""
           
fun_dir($d->path.$df."/",$A,$path); 
         }
      } 
$d->close();   
    }
     
    
$cont=array();
    
fun_dir("../../../home/",$cont);
    
$cont["generado.txt"]="Zip generado".date("Y-m-d H:i:s");
    
$data createzip($cont);
     
    
header("Pragma: public");
    
header("Expires: 0");
    
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    
header("Cache-Control: private",false);
    
header("Content-Description: File Transfer"); 
    
header("Content-Type: application/force-download"); 
    
header("Content-Length: " strlen($data)); 
    
header("Content-Disposition: attachment; filename=demozip.zip"); 
    echo 
$data
Es un código pre-fabricado el cual adapté (o intenté) a mis necesidades.

Saludos !
__________________
Yo hago preguntas inteligentes para obtener respuestas rapidas, y vos?
(únete a la campaña !)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:29.