Está usted en Indice > Construcción > Lenguajes > PHP > Lecciones y Paso a Paso > Evitar conflictos escritura/lectura en PHP
Construcción
Maletín
Utilidades
Cursos
Promoción
Rentabilidad
Zona Novatos
Foros
Acceso a tu cuenta

Evitar conflictos escritura/lectura en PHP

Evitar conflictos escritura/lectura en PHP

Conflictos escritura/lectura

Nuestras páginas php serán vistas (sin duda) por un gran número de personas; es posible que en algun momento dos o mas personas soliciten el mismo fichero a la vez. Mientras esto no es ningun problema cuando se trata de ficheros de solo lectura, si puede llegar a serlo, y grave, cuando se trate de archivos con permisos de lectura/escritura.

Pensemos en el ejemplo típico, un contador de visitas que a cada nuevo visitante abre el fichero donde se guardan los datos, pone dentro la información de la nueva visita, y después lo cierra. ¿que pasaría si durante la operación de escritura hay otro usuario que visita la web? que el script abriría de nuevo el fichero y escribiría los datos antes de que la anterior operación hubiera terminado.

Si coinciden los dos procesos, como mal menor, la información se escribirá de forma incorrecta (y por tanto inutil). Como mal peor, tendremos un fichero corrupto.

Para evitar estos problemas al manejar archivos, con php disponemos de la función flock (file lock) con la cual podemos poner un candado al archivo (impidiendo que se abra en modo escritura) o reabrirlo a voluntad.

<?
if ($file = fopen( "/home/user/pub/mylog.log", "a")) //file handler

{

flock($file, 2); // cerramos $file
fputs($file, $the_line); // escribimos el contenido en el

flock($file, 3); // terminada la escritura, quitamos cierre
fclose($file); // cerrar archivo
}

?>

Opciones de flock()

flock() opera sobre un file handler que debe apuntar a un fichero previamente abierto. Puede tener los siguientes valores:

  • Para que adquiera un bloqueo compartido (lectura), se fija su valor a 1. Mas de un proceso puede tener un candado compartido para un mismo archivo.
  • Para obtener un bloqueo exclusivo (escritura), se fija el valor a 2. Solo un proceso puede tener un candado exclusivo. Los demás procesos deben esperar
  • Para liberar un bloqueo (compartido o exclusivo), se fija el valor a 3.
  • Si no quieres que flock() bloquee mientras está activado, suma 4 al valor fijado. si se quiere que flock no bloquee el script sumar 4 al modo (modos: 5,6,7) y consultar por el valor devuelto por la función: true si el lock fue adquirido o false si no fue adquirido. Usando esta función pueden implementarse mecanismos de sincronización entre procesos

Autor: Ignside
http://www.ignside.net/man/php/archivos.4.php



Usuarios que han visto este tema también han visto...

- Información Encriptada en la DB Oracle (PHP)
- Enviar un formulario por correo electrónico
- Introducción al PHP y a las librerías
- Variables variables con PHP
- Encuesta con PHP


Versión imprimible - Versión imprimible de este documento
Enviar e-mail - Enviar por e-mail este documento
Publicidad






Cursos de Community Manager

Información legal | Política de Privacidad | Contacte con nosotros

Otro proyecto de Factoría de Internet. Copyright© 2003-2011 Factoría de Internet S.L.. Todos los derechos reservados.


Página generada el 13-02-2012 a las 10:22:54