2010-09-20 13 views
17

El siguiente código es parte de un servicio web PHP que he escrito. Toma algunos datos Base64 cargados, los decodifica y los agrega a un archivo. Todo esto funciona bienPHP filesize reporting old size

El problema es que cuando leo el tamaño del archivo después de la operación de adición obtengo el tamaño del archivo antes de la operación de adición.

$fileOut = fopen($filepath.$filename, "ab") 
fwrite($fileOut, base64_decode($data)); 
fflush($fileOut); 
fclose($fileOut); 

$newSize = filesize($filepath.$filename); // gives old file size 

¿Qué estoy haciendo mal?

del sistema es:

  • PHP 5.2.14
  • Apache 2.2.16 del kernel
  • Linux 2.6.18
+0

'b' se utiliza para generar datos binarios. No debería causar el problema. –

Respuesta

34

En los sistemas basados ​​en Linux, datos obtenidos por filesize() se "statcached".

Intente llamar al clearstatcache(); antes de la llamada al tamaño del archivo.

7

De acuerdo con el manual de PHP:

Los resultados de esta función son en caché. Consulte clearstatcache() para obtener más información sobre .

http://us2.php.net/manual/en/function.filesize.php

Básicamente, usted tiene que borrar la memoria caché de estadísticas después de la operación de archivo:

$fileOut = fopen($filepath.$filename, "ab") 
fwrite($fileOut, base64_decode($data)); 
fflush($fileOut); 
fclose($fileOut); 

clearstatcache(); 

$newSize = filesize($filepath.$filename); 
2

PHP almacena todos los metadatos de archivo que lee en un caché, por lo que es probable que el tamaño del archivo ya esté almacenado en ese caché, y debe borrarlo. Consulte clearstatcache y llámelo antes de llamar al filesize.