2010-03-15 22 views
8

Estoy haciendo un contador de carga de página simple almacenando el conteo actual en un archivo. Así es como yo quiero hacer esto:Leer y escribir en un archivo mientras mantiene el bloqueo

  1. bloquear el archivo (rebaño)
  2. Leer el recuento actual (fread)
  3. incrementarlo (++)
  4. Escribir nuevo recuento (fwrite)
  5. archivo de desbloqueo/cerrarla (manada/fclose)

se puede hacer esto sin perder la cerradura?

Según tengo entendido, el archivo no se puede escribir sin perder el bloqueo. La única forma en que se me ocurrió abordar esto, es escribir un personaje usando el modo "r +" y luego contar caracteres.

+0

La carga 1 carácter/página en realidad podría ser muy divertido :) Observación de ese archivo de crecer ... – Znarkus

Respuesta

19

Como se ha dicho, se puede usar rebaño. Un ejemplo sencillo sería:

//Open the File Stream 
$handle = fopen("file.txt","r+"); 

//Lock File, error if unable to lock 
if(flock($handle, LOCK_EX)) { 
    $count = fread($handle, filesize("file.txt")); //Get Current Hit Count 
    $count = $count + 1; //Increment Hit Count by 1 
    ftruncate($handle, 0); //Truncate the file to 0 
    rewind($handle);   //Set write pointer to beginning of file 
    fwrite($handle, $count); //Write the new Hit Count 
    flock($handle, LOCK_UN); //Unlock File 
} else { 
    echo "Could not Lock File!"; 
} 

//Close Stream 
fclose($handle); 
+1

¡Gracias, ftruncate era lo que estaba buscando! – Znarkus

+1

ftruncate no funcionó como se esperaba, pero 'rewind' hizo el truco – Znarkus

+3

En mi caso, tengo que usar' rewind ($ handle) 'después de' ftruncate ($ handle, 0) ' – bingjie2680

3

Creo que puede lograrlo usando flock. Abra un puntero a su archivo, flock, lea los datos, escriba los datos, luego cierre (cierre se desbloquea automáticamente).

http://php.net/flock

+0

Sí sé acerca rebaño, pero no cómo mantener la cerradura cuando Yo escribo. – Znarkus

+0

El bloqueo se mantiene hasta que desbloquea, cierra el archivo o finaliza el script. –

+1

Ya no se desbloquea automáticamente, desde 5.3.2 – Tertium

1

Sí, usted tiene que utilizar antes de rebobinado ftruncate. De lo contrario, el contenido anterior del archivo solo se rellena con ceros.

La secuencia de trabajo es:

fopen 
    flock LOCK_EX 
    fread filesize 
    rewind 
    ftruncate 0 
    fwrite 
    flock LOCK_UN 
    fclose 
Cuestiones relacionadas