(PHP 4, PHP 5, PHP 7, PHP 8)
flock — Bloquea el fichero
flock() permite realizar un sistema simple de bloqueos de escritura/lectura, que puede ser utilizado en cualquier plataforma (incluyendo Unix y Windows).
El bloqueo también se libera con fclose(),
o cuando stream
es recogido por el recolector de basura.
PHP dispone de un sistema completo de bloqueo de ficheros.
Todos los programas que accedan al fichero deben utilizar la
misma metodología de bloqueo para que sea efectivo. Por
omisión, esta función se bloqueará hasta que el bloqueo solicitado
sea adquirido; este comportamiento puede ser controlado con la opción LOCK_NB
cuya documentación se encuentra a continuación.
stream
Resource que apunta a un fichero del sitema que normalmente es creado usando fopen().
operation
operation
puede tomar uno de los siguientes valores:
LOCK_SH
para adquirir un bloqueo compartido (lectura).
LOCK_EX
para adquirir un bloqueo exclusivo (escritura).
LOCK_UN
para liberar un bloqueo (compartido o exclusivo).
Asimismo, es posible añadir LOCK_NB
como máscara de una de las operaciones anteriores si no
se desea que la función flock() se bloquee durante
el bloqueo.
would_block
Este tercer argumento opcional se establece a 1 si el bloqueo
debe bloquear el script (condición de error EWOULDBLOCK
).
Ejemplo #1 Ejemplo con flock()
<?php
$fp = fopen("/tmp/lock.txt", "r+");
if (flock($fp, LOCK_EX)) { // adquiere un bloqueo exclusivo
ftruncate($fp, 0); // borrado del contenido
fwrite($fp, "Escribir en un fichero\n");
fflush($fp); // libera el contenido antes de quitar el bloqueo
flock($fp, LOCK_UN); // Quita el bloqueo
} else {
echo "¡Imposible bloquear el fichero!";
}
fclose($fp);
?>
Ejemplo #2 Ejemplo con flock() utilizando la opción LOCK_NB
<?php
$fp = fopen('/tmp/lock.txt', 'r+');
/* Activación de la opción LOCK_NB durante una operación LOCK_EX */
if(!flock($fp, LOCK_EX | LOCK_NB)) {
echo 'Imposible obtener el bloqueo';
exit(-1);
}
/* ... */
fclose($fp);
?>
Nota:
flock() utiliza bloqueos obligatorios bajo Windows, que también son soportados en Linux y sistemas derivados de System V mediante la llamada al sistema fcntl(): si el fichero en cuestión tiene el bit setgid activado y el bit de grupo vacío. En Linux, el sistema de ficheros deberá ser montado con la opción mand para que esto funcione.
Nota:
Al requerir un puntero de fichero, flock() puede ser necesario utilizar un bloqueo especial para proteger el acceso al fichero que se desea truncar al abrirlo en modo escritura (con "w" o "w+" como argumento de fopen()).
Nota:
Debería ser utilizado únicamente en recursos provenientes de fopen() para ficheros locales o mediante el gestor de flujos personalizado definiendo streamWrapper::stream_lock().
Asignar otro valor al argumento stream
en este código liberará el bloqueo.
En ciertos sistemas operativos, flock() está implementado a nivel de proceso. Al utilizar una API multihilo, puede que no se pueda confiar en flock() para proteger ficheros contra otros scripts PHP que funcionen en paralelo en otros hilos del mismo servidor.
flock() no es soportado en sistemas de ficheros antiguos
como FAT
y sus derivados, y siempre devolverá
false
en estos entornos.
Nota:
En Windows, si el procedimiento de bloqueo abre un fichero por segunda vez, no puede acceder al fichero a través de este gestor hasta que el fichero sea desbloqueado.