(PHP 4, PHP 5)
flock — Bloqueo de archivos asesorado portable
$handle
, int $operation
[, int &$wouldblock
] )flock() permite llevar a cabo un simple modelo de lectura/escritura que puede ser usado en cada plataforma virtual (incluidas la mayoría de las derivadas de Unix e incluso Windows).
En versiones de PHP anteriores a 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 una manera portable de bloquear archivos completos de una forma asesorada
(lo cual significa que todos los programas de acceso tiene que usar la misma forma de
bloqueo o no funcionará). Por defecto, esta función operará hasta que el
bloqueo solicitado sea adquirido; esto se puede controlar (en plataformas diferentes
de Windows) 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 opción de las siguientes:
LOCK_SH
para solicitar un bloqueo compartido (lectura).
LOCK_EX
para solicitar un bloqueo exclusivo (escritura).
LOCK_UN
para solicitar un desbloqueo (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()
bloquee mientras opera. (no soportado en Windows)
wouldblock
El tercer argumento opcional es establecido a TRUE
si el aviso produciría un bloqueo
(condición errno EWOULDBLOCK). (no soportado en Windows)
Devuelve TRUE
en caso de éxito o FALSE
en caso de error.
Versión | Descripción |
---|---|
5.3.2 | Se eliminó el desbloqueo automático al cerrarse el gestor de recurso. El desbloqueo ahora siempre tiene que ser hecho manualmente. |
4.0.1 |
Se añadieron las constantes LOCK_XXX. Antes de esta versión
se debe usar 1 para LOCK_SH , 2 para
LOCK_EX , 3 para LOCK_UN y
4 para LOCK_NB
|
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 archivo
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:
flock() usa el bloqueo de forma obligada en vez del bloqueo asesorado en Windows. Lo obligación del bloqueo también está soportado en sistemas operativos basados en Linux y System V mediante el mecanismo usual soportado por la llamada al sistema fcntl(): es decir, si el archivo en cuestión tiene el bit de permiso setgid establecido y el bit de ejecución de grupo despejado. En Linux, el sistema de archivos también necesita ser montado con la opción mand para que esto funcione.
Nota:
Ya que flock() requiere un puntero a un archivo, puede tener que usar un archivo de bloqueo especial para proteger el acceso al archivo 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 archivos devueltos por fopen() para archivos locales, o punteros de archivos apuntando 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 multi-hilo como ISAPI, ¡no se podrá confiar en flock() para proteger archivos contra otros scripts de PHP que se ejecuten en hilos paralelos en la misma instancia del servidor!
flock() no está soportado en sistemas de archivos anticuados como
FAT y sus derivados y por lo tanto siempre
devuelve FALSE
bajo estos entornos (esto es especialmente válido para
usuarios de Windows 98).