Blog de Gonzalo

BLOQUEAR ARCHIVOS EN PHP

Un problema bastante importante cuando se trabaja con ficheros es cuando varios procesos intentan escribir en un mismo archivo al mismo tiempo. La función fopen no evita que otro script abra el mismo archivo y escriba en el mismo archivo y producirse efectos no deseados. La solución a este problema es utilizar el bloqueo de archivos. Para bloquear archivos en php se hace mediante la función flock.
Cuando bloquea un archivo, se puede marcar como un bloqueo de solo lectura, compartiendo así el acceso al archivo con otros procesos, o un bloqueo exclusivo, lo que le permite realizar cambios en el archivo.
La función flock necesita identificador de archivo como primer parámetro y el tipo de bloqueo como segundo parámetro.
Las opciones de bloqueo son:

  • LOCK_SH Bloqueo compartido (lectura).
  • LOCK_EX: Bloqueo exclusivo (escritura).
  • LOCK_UN: Desbloquear el fichero (compartido o exclusivo).
Veamos un ejemplo:

$fp = fopen('lock.txt', 'a+');
flock($fp, LOCK_EX);
$fp3 = fopen('lock.txt', 'r+');
fwrite($fp3,'texto a escribir en fichero');
En el ejmplo anterior vemos que se abre el fichero lock.txt y se bloqua para la escritura y luego se abre con otro manejador de ficheros y se intenta escribir y nos dará error para evitar el error es necesario añadir el desbloqueo:

$fp = fopen('lock.txt', 'a+');
flock($fp, LOCK_EX);
$fp3 = fopen('lock.txt', 'r+');
flock($fp, LOCK_EX);
fwrite($fp3,'texto a escribir en fichero');
En este segundo ejemplo no da error, ya que el fichero ha sido desbloquado. Los ejemplos anteriores son bastante sencillos para ver un funcionamiento que fuese fácil de entender.

Compartir en twitter