flock

(PHP 4, PHP 5, PHP 7)

flockBloqueo de ficheros recomendado y portable

Descripción

flock ( resource $handle , int $operation [, int &$wouldblock ] ) : bool

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

Parámetros

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

Valores devueltos

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

Historial de cambios

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.

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 fichero
    
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:

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

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