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($archivo, strrpos($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);
}
}
}
}
Código PHP:
20100709 07:57:18 086276t7ol4lkc9rgvr43ctm53 OK Archivo: prueba.txt
20100709 07:57:18 086276t7ol4lkc9rgvr43ctm53 OK Tipo: text/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
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.