2010-09-20 10 views
17

Der folgende Code ist Teil eines PHP-Web-Service, den ich geschrieben habe. Es benötigt einige hochgeladene Base64-Daten, dekodiert sie und hängt sie an eine Datei an. Das alles funktioniert gut.PHP-Dateigröße Bericht alte Größe

Das Problem ist, dass, wenn ich die Dateigröße nach der Append-Operation lese ich die Größe der Datei vor der Append-Operation war.

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

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

Was mache ich falsch?

-System ist:

  • PHP 5.2.14
  • Apache 2.2.16
  • Linux-Kernel 2.6.18
+0

'b' wird zur Ausgabe von Binärdaten verwendet. Es sollte das Problem nicht verursachen. –

Antwort

34

Auf Linux-basierte Systemen von filesize() geholt Daten "statcached".

Versuchen Sie, vor dem Aufruf der Dateigröße clearstatcache(); aufzurufen.

7

Nach dem PHP-Handbuch:

Die Ergebnisse dieser Funktion sind zwischengespeichert. Weitere Informationen finden Sie unter clearstatcache() Details.

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

Grundsätzlich haben Sie die Stat-Cache nach der Dateioperation löschen:

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

clearstatcache(); 

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

PHP speichert alle gelesenen Dateimetadaten in einem Cache, daher ist es wahrscheinlich, dass die Dateigröße bereits in diesem Cache gespeichert ist und Sie sie löschen müssen. Siehe clearstatcache und rufen Sie an, bevor Sie filesize anrufen.