(PHP 4, PHP 5, PHP 7)
flock — Bloqueo de ficheros recomendado y portable
$handle
, int $operation
[, int &$wouldblock
] ) : boolflock() permite representar un modelo sencillo de lectura/escritura que puede emplearse virtualmente en cada plataforma (incluidas la mayoría de las derivadas de Unix e incluso Windows).
En versiones de PHP anteriores a la 5.3.2, el bloqueo es liberado también por fclose() (la cual es también llamada automáticamente cuando finaliza el script).
PHP soporta de manera portable el bloqueo de ficheros completos de una forma recomendada
(lo cual significa que todos los programas que accedan tiene que utilizar la misma forma de
bloqueo o este no funcionará). Por defecto, esta función estará en espera hasta adquirir el bloqueo
solicitado; esto se puede controlar con la opción LOCK_NB
documentada abajo.
handle
Resource que apunta a un fichero del sitema que normalmente es creado usando fopen().
operation
operation
es una operación de las siguientes:
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).
También es posible añadir LOCK_NB
como una máscara de bit
a una de las operaciones de arriba si no se desea que flock()
quede esperando mientras obtiene el bloqueo.
wouldblock
El tercer argumento opcional se establece a 1 si el bloqueo hará que la función quede esperando (condición de errno EWOULDBLOCK).
Devuelve TRUE
en caso de éxito o FALSE
en caso de error.
Versión | Descripción |
---|---|
5.5.22, 5.6.6 |
Se añadió soporte para el parámetro wouldblock en
Windows.
|
5.3.2 | Se eliminó la liberación del bloqueo automática al cerrarse el manejador del recurso. La liberación del bloqueo ahora siempre tiene que realizarse manualmente. |
Ejemplo #1 Ejemplo de flock()
<?php
$fp = fopen("/tmp/lock.txt", "r+");
if (flock($fp, LOCK_EX)) { // adquirir un bloqueo exclusivo
ftruncate($fp, 0); // truncar el fichero
fwrite($fp, "Escribir algo aquí\n");
fflush($fp); // volcar la salida antes de liberar el bloqueo
flock($fp, LOCK_UN); // libera el bloqueo
} else {
echo "¡No se pudo obtener el bloqueo!";
}
fclose($fp);
?>
Ejemplo #2 flock() usando la opción LOCK_NB
<?php
$fp = fopen('/tmp/lock.txt', 'r+');
/* Activar la opción LOCK_NB sobre una operación LOCK_EX */
if(!flock($fp, LOCK_EX | LOCK_NB)) {
echo 'No se puede obtener el bloqueo';
exit(-1);
}
/* ... */
fclose($fp);
?>
Nota:
En Windows, flock() usa el bloqueo obligado en lugar del bloqueo recomendado. El bloqueo obligado también está soportado en sistemas operativos basados en Linux y System V mediante el mecanismo habitual soportado por la llamada al sistema fcntl(): esto es, si el fichero en cuestión tiene el bit de permiso setgid establecido y el bit de ejecución de grupo despejado. Para que esto funcione en Linux, el sistema de ficheros también debe ser montado con la opción mand.
Nota:
Ya que flock() requiere un puntero a un fichero, puede ser necesario usar un fichero de bloqueo especial para proteger el acceso al fichero que se quiere truncar, abriéndolo en modo escritura (con un argumento "w" o "w+" de fopen()).
Nota:
Sólo se puede usar en punteros de ficheros devueltos por fopen() para ficheros locales, o punteros de ficheros que apuenten a flujos de espacios de usuario que implementen el método streamWrapper::stream_lock().
Asignar otro valor al argumento handle
en el
código subsiguiente liberará el bloqueo.
En algunos sistemas operativos flock() está implementado a nivel de proceso. Cuando se usa una API de servidor multihilo como ISAPI, no se podrá confiar en flock() para proteger ficheros contra otros scripts de PHP que se ejecuten en hilos paralelos en la misma instancia del servidor.
flock() no está soportado en sistemas de ficheros anticuados como
FAT y sus derivados y por lo tanto siempre
devuelve FALSE
bajo estos entornos.