Funciones del Sistema de Archivos
PHP Manual

flock

(PHP 4, PHP 5)

flockBloqueo de archivos asesorado portable

Descripción

bool flock ( resource $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.

Parámetros

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 1 si el aviso produciría un bloqueo (condición errno EWOULDBLOCK). (no soportado en Windows)

Valores devueltos

Devuelve TRUE en caso de éxito o FALSE en caso de error.

Historial de cambios

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

Ejemplos

Ejemplo #1 Ejemplo de flock()

<?php

$fp 
fopen("/tmp/lock.txt""r+");

if (
flock($fpLOCK_EX)) {  // adquirir un bloqueo exclusivo
    
ftruncate($fp0);      // truncar el archivo
    
fwrite($fp"Escribir algo aquí\n");
    
fflush($fp);            // volcar la salida antes de liberar el bloqueo
    
flock($fpLOCK_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($fpLOCK_EX LOCK_NB)) {
    echo 
'No se puede obtener el bloqueo';
    exit(-
1);
}

/* ... */

fclose($fp);
?>

Notas

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().

Advertencia

Asignar otro valor al argumento handle en el código subsiguiente liberará el bloqueo.

Advertencia

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).


Funciones del Sistema de Archivos
PHP Manual