Ver Mensaje Individual
  #1 (permalink)  
Antiguo 09/07/2010, 04:08
socket
 
Fecha de Ingreso: julio-2010
Mensajes: 1
Antigüedad: 13 años, 9 meses
Puntos: 0
Problema muy raro con copy

Hola a todos.

Tengo un problema bastante raro con copy y/o rename, son funciones muy simples y faciles de utilizar, pero me estoy volviendo loko, me explico:

La aplicación está bajo IIS 6.0 en windows 2003. Ya sé que no es la configuración deseada por la mayoria, pero el cliente manda y no creo que tenga nada que ver con el problema que tengo. PHP funciona muy bien en cualquier entorno.

El problema radica al subir un archivo al servidor, lo copio a una carpeta temporal para validarlo, tras la validación, si es correcta, muevo el archivo a la carpeta del usuario. La carpeta del usuario puede tener hasta dos niveles diferentes dependiendo del tipo de archivo. Parece fácil pero hay veces que me sucede una cosa estraña, el archivo no se me mueve a la carpeta destino y php me dice que si que se ha movido.

Os muestro el código. Bueno, parte de él porque el script es demasiado grande, pero con esta parte es suficiente.

Código PHP:
  if((!empty($_FILES["origen"])) && ($_FILES['origen']['error'] == 0)) {
    
    
$tipo $_FILES["origen"]["type"];
    
$directorio_destino 'X:/tmp/';
    
    
inserta_log('Archivo: '.basename($_FILES['origen']['name']),0);
    
inserta_log('Tipo: '.$tipo,0);
    
    if (
in_array($tipo,$tipos_soportados)){ //unicos tipo aceptados
      
        
$archivo basename($_FILES['origen']['name']);
        
$extension substr($archivostrrpos($archivo'.') + 1);
      
        
// creamos nombre unico
        // ejemplo nombre: 1234567890.txt
        
$ahora time();        
while(
file_exists($directorio_destino.$ahora.$_SESSION["numero_sesion"])){
          
$ahora++;
      }
      
      
//INDICAMOS EL PATH DONDE GUARDAR EL ARCHIVO
      
$archivo_tmp $directorio_destino.$ahora.$_SESSION["numero_sesion"];
      if ((
move_uploaded_file($_FILES['origen']['tmp_name'],$archivo_tmp))) {
         
inserta_log('Fichero guardado en tmp OK',0);
      } else {
         
inserta_log('Error al mover el fichero a tmp',1); 
         
$error_global=true;
         
$msg_error Literal(10);
      }
      
    } else {
        
        
inserta_log('Tipo de archivo incorrecto',1); 
        
$error_global=true;
        
$msg_error Literal(1007);
    }
    
  } else {
    
inserta_log('Error al subir el fichero',1); 
    
$error_global=true;
    
$msg_error Literal(10);
  }
  
  
//validamos estructura fichero
  
if (!$error_global){
    include(
'includes/validarFichero_class.php');
    
$validacion = new validar_fichero();
    
$resultado $validacion ->valida($archivo_tmp,$_POST['tipo']);
    if (!
$resultado){
        
inserta_log('Estructura incorrecta',1); 
        
$error_global=true;
        
$msg_error Literal(5);  
     }
  }
  
  
  
//movemos el cuaderno a su ubicacion correcta
  
if (!$error_global){  
    
    
//comprobamos que las carpetas existan
    
$directorio_tipo_fichero dirname($ruta_fichero);
    
$directorio_usuario dirname($directorio_tipo_fichero);
    
    
inserta_log('Directorio fichero'.$directorio_tipo_fichero,0);
    
inserta_log('Directorio usuario'.$directorio_usuario,0);
    
    if(!
is_dir($directorio_usuario)){
      
inserta_log(' No existe directorio usuario',1);
      
mkdir($directorio_usuario);
      if(!
is_dir($directorio_usuario)){
        
inserta_log('Error al crear la carpeta usuario',1);
        
$msg_error=Literal(2);
        
$error_global=true;
      }else{
        
inserta_log('Directorio creado correctamente',0);
      }
    }
    
    if (!
$error_global){
      if(!
is_dir($directorio_tipo_fichero)){
        
inserta_log(' No existe directorio tipo_fichero',1);
        
mkdir($directorio_tipo_fichero);
        if(!
is_dir($directorio_tipo_fichero)){
          
inserta_log('Error al crear la carpeta tipo_fichero',1);
          
$msg_error=Literal(2);
          
$error_global=true;
        }else{
          
inserta_log('Directorio creado correctamente',0);
        }
      }
    }
  
    if (!
$error_global){
      
inserta_log('Archivo tmp '.$archivo_tmp,0);
      
inserta_log('Nueva ruta fichero '.$ruta_fichero,0);
      if (!
copy($archivo_tmp$ruta_fichero)) {
        
inserta_log('Error al mover el archivo');
        
$msg_error=Literal(2);
        
$error_global=true;
      }else{
        
inserta_log('Archivo movido correctamente',0);
        if (!
file_exists($ruta_fichero)){
          
$error_global=true;
          
inserta_log('EL FICHERO NO EXISTE EN DESTINO!!!!!',1);
        }else{
          
inserta_log('Archivo en destino comprobado correctamente',0);
        }
      }  
    }
  } 
Como veis en el código voy imprimiendo un log, el log es el siguiente:
Código PHP:
  20100709 07:57:18 086276t7ol4lkc9rgvr43ctm53 OK Archivoprueba.txt
  20100709 07
:57:18 086276t7ol4lkc9rgvr43ctm53 OK Tipotext/plain
  20100709 07
:57:18 086276t7ol4lkc9rgvr43ctm53 OK Fichero guardado en tmp OK
  20100709 07
:57:18 086276t7ol4lkc9rgvr43ctm53 OK Directorio Fichero X:/archivos/recibidos/usuario_1/tipo_1
  20100709 07
:57:18 086276t7ol4lkc9rgvr43ctm53 OK Directorio usuario X:/archivos/recibidos/usuario_1
  20100706 07
:57:18 086276t7ol4lkc9rgvr43ctm53 KO  No existe directorio usuario
  20100706 07
:57:18 086276t7ol4lkc9rgvr43ctm53 OK Directorio creado correctamente 
  20100706 07
:57:18 086276t7ol4lkc9rgvr43ctm53 KO  No existe directorio fichero
  20100706 07
:57:18 086276t7ol4lkc9rgvr43ctm53 OK Directorio creado correctamente
  20100709 07
:57:18 086276t7ol4lkc9rgvr43ctm53 OK Archivo tmp X:/tmp/127865503854500000002146995
  20100709 07
:57:18 086276t7ol4lkc9rgvr43ctm53 OK Nueva ruta archivo X:/archivos/recibidos/usuario_1/tipo_1/nuevo_nombre.txt 
  20100709 07
:57:18 086276t7ol4lkc9rgvr43ctm53 OK Archivo movido correctamente
  20100709 07
:57:18 086276t7ol4lkc9rgvr43ctm53 OK Archivo en destino comprobado correctamente 
Nunca he tenido ningun error ni en el log que genero yo ni el log de php, pero de vez en cuando el archivo que he copiado a la carpeta temporal no se me copia al directorio destino, lo raro es que php me dice que lo ha movido correctamente y al comprobarlo que existe pero no es cierto tal y como veis en el log.

El tema ya no se por donde pillarlo, cada dia se suben alrededor de 100 archivos y tengo solo problemas con tres o cuatro de ellos, las carpetas siempre se crean correctamente, los permisos son correctos, ya que si no cantaria el log de php. He cambiado el copy por un rename y la cosa es peor todavia, cuando sucede lo mismo el archivo desaparece y no canta ningun error.

Los logs los tengo activados en E_ALL & ~E_NOTICE | E_STRICT y el safe_mode a off. He intentado saber un poco mas alla con el backtrace pero no consigo nada, no sé al final pensaré que es un bug...

Alguna sugerencia??

Muchas Gracias.