<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/ref.filesystem.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'es',
  ),
  'this' => 
  array (
    0 => 'function.flock.php',
    1 => 'flock',
    2 => 'Bloquea el fichero',
  ),
  'up' => 
  array (
    0 => 'ref.filesystem.php',
    1 => 'Funciones del Sistema de Archivos',
  ),
  'prev' => 
  array (
    0 => 'function.filetype.php',
    1 => 'filetype',
  ),
  'next' => 
  array (
    0 => 'function.fnmatch.php',
    1 => 'fnmatch',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    'path' => 'reference/filesystem/functions/flock.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="function.flock" class="refentry">
 <div class="refnamediv">
  <h1 class="refname">flock</h1>
  <p class="verinfo">(PHP 4, PHP 5, PHP 7, PHP 8)</p><p class="refpurpose"><span class="refname">flock</span> &mdash; <span class="dc-title">Bloquea el fichero</span></p>

 </div>

 <div class="refsect1 description" id="refsect1-function.flock-description">
  <h3 class="title">Descripción</h3>
  <div class="methodsynopsis dc-description">
   <span class="methodname"><strong>flock</strong></span>(<span class="methodparam"><span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span> <code class="parameter">$stream</code></span>, <span class="methodparam"><span class="type"><a href="language.types.integer.php" class="type int">int</a></span> <code class="parameter">$operation</code></span>, <span class="methodparam"><span class="type"><a href="language.types.integer.php" class="type int">int</a></span> <code class="parameter reference">&$would_block</code><span class="initializer"> = <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></span></span>): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>

  <p class="para rdfs-comment">
   <span class="function"><strong>flock()</strong></span> permite realizar un sistema simple de
   bloqueos de escritura/lectura, que puede ser utilizado en
   cualquier plataforma (incluyendo Unix y Windows).
  </p>
  <p class="para">
   El bloqueo también se libera con <span class="function"><a href="function.fclose.php" class="function">fclose()</a></span>,
   o cuando <code class="parameter">stream</code> es recogido por el recolector de basura.
  </p>
  <p class="para">
   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 <strong><code><a href="filesystem.constants.php#constant.lock-nb">LOCK_NB</a></code></strong>
   cuya documentación se encuentra a continuación.
  </p>
 </div>


 <div class="refsect1 parameters" id="refsect1-function.flock-parameters">
  <h3 class="title">Parámetros</h3>
  <p class="para">
   <dl>
    
     <dt><code class="parameter">stream</code></dt>
     <dd>
      <p class="para">Un puntero del sistema de archivos de tipo <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>
que es habitualmente creado utilizando la función <span class="function"><a href="function.fopen.php" class="function">fopen()</a></span>.</p>
     </dd>
    
    
     <dt><code class="parameter">operation</code></dt>
     <dd>
      <p class="para">
       <code class="parameter">operation</code> puede tomar uno de los siguientes valores:
       <ul class="itemizedlist">
        <li class="listitem">
         <span class="simpara">
          <strong><code><a href="filesystem.constants.php#constant.lock-sh">LOCK_SH</a></code></strong> para adquirir un bloqueo compartido (lectura).
         </span>
        </li>
        <li class="listitem">
         <span class="simpara">
          <strong><code><a href="filesystem.constants.php#constant.lock-ex">LOCK_EX</a></code></strong> para adquirir un bloqueo exclusivo (escritura).
         </span>
        </li>
        <li class="listitem">
         <span class="simpara">
          <strong><code><a href="filesystem.constants.php#constant.lock-un">LOCK_UN</a></code></strong> para liberar un bloqueo (compartido o exclusivo).
         </span>
        </li>
       </ul>
      </p>
      <p class="para">
       Asimismo, es posible añadir <strong><code><a href="filesystem.constants.php#constant.lock-nb">LOCK_NB</a></code></strong>
       como máscara de una de las operaciones anteriores si no
       se desea que la función <span class="function"><strong>flock()</strong></span> se bloquee durante
       el bloqueo.
      </p>
     </dd>
    
    
     <dt><code class="parameter">would_block</code></dt>
     <dd>
      <p class="para">
       Este tercer argumento opcional se establece a 1 si el bloqueo
       debe bloquear el script (condición de error <code class="literal">EWOULDBLOCK</code>).
      </p>
     </dd>
    
   </dl>
  </p>
 </div>


 <div class="refsect1 returnvalues" id="refsect1-function.flock-returnvalues">
  <h3 class="title">Valores devueltos</h3>
  <p class="para">
   Esta función retorna <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> en caso de éxito o <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> si ocurre un error.
  </p>
 </div>


 <div class="refsect1 examples" id="refsect1-function.flock-examples">
  <h3 class="title">Ejemplos</h3>
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>Ejemplo #1 Ejemplo con <span class="function"><strong>flock()</strong></span></strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$fp </span><span style="color: #007700">= </span><span style="color: #0000BB">fopen</span><span style="color: #007700">(</span><span style="color: #DD0000">"/tmp/lock.txt"</span><span style="color: #007700">, </span><span style="color: #DD0000">"r+"</span><span style="color: #007700">);<br /><br />if (</span><span style="color: #0000BB">flock</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #0000BB">LOCK_EX</span><span style="color: #007700">)) { </span><span style="color: #FF8000">// adquiere un bloqueo exclusivo<br />    </span><span style="color: #0000BB">ftruncate</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #0000BB">0</span><span style="color: #007700">);     </span><span style="color: #FF8000">// borrado del contenido<br />    </span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #DD0000">"Escribir en un fichero\n"</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">fflush</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">);            </span><span style="color: #FF8000">// libera el contenido antes de quitar el bloqueo<br />    </span><span style="color: #0000BB">flock</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #0000BB">LOCK_UN</span><span style="color: #007700">);    </span><span style="color: #FF8000">// Quita el bloqueo<br /></span><span style="color: #007700">} else {<br />    echo </span><span style="color: #DD0000">"¡Imposible bloquear el fichero!"</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>
  <p class="para">
   <div class="example" id="example-2">
    <p><strong>Ejemplo #2 Ejemplo con <span class="function"><strong>flock()</strong></span> utilizando la opción <strong><code><a href="filesystem.constants.php#constant.lock-nb">LOCK_NB</a></code></strong></strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$fp </span><span style="color: #007700">= </span><span style="color: #0000BB">fopen</span><span style="color: #007700">(</span><span style="color: #DD0000">'/tmp/lock.txt'</span><span style="color: #007700">, </span><span style="color: #DD0000">'r+'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">/* Activación de la opción LOCK_NB durante una operación LOCK_EX */<br /></span><span style="color: #007700">if(!</span><span style="color: #0000BB">flock</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #0000BB">LOCK_EX </span><span style="color: #007700">| </span><span style="color: #0000BB">LOCK_NB</span><span style="color: #007700">)) {<br />    echo </span><span style="color: #DD0000">'Imposible obtener el bloqueo'</span><span style="color: #007700">;<br />    exit(-</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br />}<br /><br /></span><span style="color: #FF8000">/* ... */<br /><br /></span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>
 </div>


 <div class="refsect1 notes" id="refsect1-function.flock-notes">
  <h3 class="title">Notas</h3>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <p class="para">
    <span class="function"><strong>flock()</strong></span> 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.
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <p class="para">
    Al requerir un puntero de fichero, <span class="function"><strong>flock()</strong></span>
    puede ser necesario utilizar un bloqueo especial para proteger el acceso al fichero
    que se desea truncar al abrirlo en modo escritura (con &quot;w&quot; o &quot;w+&quot;
    como argumento de <span class="function"><a href="function.fopen.php" class="function">fopen()</a></span>).
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <p class="para">
    Debería ser utilizado únicamente en recursos provenientes de <span class="function"><a href="function.fopen.php" class="function">fopen()</a></span>
    para ficheros locales o mediante el gestor de flujos personalizado definiendo
    <span class="function"><a href="streamwrapper.stream-lock.php" class="function">streamWrapper::stream_lock()</a></span>.
   </p>
  </p></blockquote>
  <div class="warning"><strong class="warning">Advertencia</strong>
   <p class="para">
    Asignar otro valor al argumento <code class="parameter">stream</code>
    en este código liberará el bloqueo.
   </p>
  </div>
  <div class="warning"><strong class="warning">Advertencia</strong>
   <p class="para">
    En ciertos sistemas operativos, <span class="function"><strong>flock()</strong></span> está implementado
    a nivel de proceso. Al utilizar una API multihilo, puede que no se pueda
    confiar en <span class="function"><strong>flock()</strong></span> para proteger ficheros contra otros
    scripts PHP que funcionen en paralelo en otros hilos del mismo servidor.
   </p>
   <p class="para">
    <span class="function"><strong>flock()</strong></span> no es soportado en sistemas de ficheros antiguos
    como <code class="literal">FAT</code> y sus derivados, y siempre devolverá
    <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> en estos entornos.
   </p>
  </div>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <p class="para">
    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.
   </p>
  </p></blockquote>
 </div>


</div><?php manual_footer($setup); ?>