Foros del Web » Programando para Internet » PHP »

Problema con memoria máxima en PHP.

Estas en el tema de Problema con memoria máxima en PHP. en el foro de PHP en Foros del Web. Hola amigos, les cuento que estoy creando un sistema mediante PHP que genera un respaldo de las carpetas que yo solicite dentro del servidor y ...
  #1 (permalink)  
Antiguo 02/07/2008, 11:44
Avatar de marcosr  
Fecha de Ingreso: agosto-2005
Ubicación: Montevideo, Uruguay
Mensajes: 451
Antigüedad: 18 años, 8 meses
Puntos: 5
Problema con memoria máxima en PHP.

Hola amigos, les cuento que estoy creando un sistema mediante PHP que genera un respaldo de las carpetas que yo solicite dentro del servidor y las mete a todas en un archivo RAR para proceder a una descarga a solicitud del usuario.

Estoy teniendo un problema y es que el tamaño total de las carpetas a respaldar es de 800MB y por esto da el siguiente error:

Cita:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 69581 bytes) in /home/www/respaldos/index.php on line 93
Digo que es por eso ya que al solicitar que respalde carpetas más chicas (~1MB), lo hace perfecto.


Existe alguna solución para que por más que demore 1 hora en hacer el respaldo, lo haga sin importar el tamaño de las carpetas?

Saludos y muchas gracias de antemano !
__________________
Yo hago preguntas inteligentes para obtener respuestas rapidas, y vos?
(únete a la campaña !)
  #2 (permalink)  
Antiguo 02/07/2008, 12:21
Avatar de Marvin
Colaborador
 
Fecha de Ingreso: febrero-2005
Ubicación: global $Chile->Santiago;
Mensajes: 1.991
Antigüedad: 19 años, 3 meses
Puntos: 81
Respuesta: Problema con memoria máxima en PHP.

Si va a demorar 1 hora debes cambiar el php.ini y ponerle mas tiempo de ejecucion, tambien si vas a subir 800MB tienes que cambiar la directiva de tamaño maximo en el mismo archivo.

Revisa aca para ver que directivas necesitas cambiar: http://cl2.php.net/manual/es/ini.php

Suerte!
__________________
El que dice "Solo sé que nada sé", esta asumiendo que sabe algo.
Lea las FAQ's!
  #3 (permalink)  
Antiguo 02/07/2008, 12:49
Avatar de marcosr  
Fecha de Ingreso: agosto-2005
Ubicación: Montevideo, Uruguay
Mensajes: 451
Antigüedad: 18 años, 8 meses
Puntos: 5
Respuesta: Problema con memoria máxima en PHP.

Marvin, muchas gracias por responder.

Te cuento que he estado probando algunas configuraciones hasta llegar a colocar 1Gb de memoria máxima para PHP [ini_set("memory_limit", "1024M");] y 20 minutos de tiempo máximo de ejecución [set_time_limit(1200);]. Aún así, se consume todo el tiempo y me da un error de que el script ha superado los 20 minutos de tiempo máximo de ejecución.

Te parece que pueda demorar más de 20 minutos en crear un RAR de 150Mb?

Saludos.

Adjunto el código para ver si encuentran algún error tonto que no halla visto...

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/www/"$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=respaldoS.zip"); 
    echo 
$data
__________________
Yo hago preguntas inteligentes para obtener respuestas rapidas, y vos?
(únete a la campaña !)
  #4 (permalink)  
Antiguo 02/07/2008, 14:31
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Problema con memoria máxima en PHP.

Hola marcosr,

Veo que estas usando funciones recursivas, ese problema del tiempo limite puede ser debido a que estas ejecutando las recursiones sin control.

Deberías hacer un debug paso a paso con algún IDE para que veas en que parte se esta ciclando.

Saludos.
  #5 (permalink)  
Antiguo 02/07/2008, 14:52
Avatar de marcosr  
Fecha de Ingreso: agosto-2005
Ubicación: Montevideo, Uruguay
Mensajes: 451
Antigüedad: 18 años, 8 meses
Puntos: 5
Respuesta: Problema con memoria máxima en PHP.

Pues si, lo que hace es un bucle y probando un poco más, he notado que el problema que tengo es totalmente independiente del peso de los archivos, de hecho se "tranca" solo al intentar respaldar home ya que contiene cientos de sub-directorios, al intentar respaldar menos directorios no hay problema.

Como hago un debug? Qué es un IDE?

Muchas gracias !
__________________
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:13.