Dennis: "is_writable" schlägt fehl

Beitrag lesen

Hi Enrico,

ACHTUNG: Du machst hier einen fatalen Fehler!

Wie dedlfix schon gesagt hat, würdest du am besten einfach file_put_contents() verwenden, der Vollständigkeit halber und fürs Archiv, möchte ich deinen Code aber trotzdem noch kommentieren.

if ($Zeiger = fopen ($Datei, 'w'))
         {
            if (flock ($Zeiger, LOCK_SH))
            {
               if (is_writable ($Datei))
               {
                  ftruncate ($Zeiger, 0);

  
Durch das Öffnen der Datei mit [fopen()](http://www.php.net/manual/en/function.fopen.php) im Modus "w" wird die Datei direkt beim Öffnen "geleert", der gesamte Inhalt der Datei wird gelöscht - damit hast du die Datei zerstört. Dass du dann im Anschluss noch versucht einen Schreib-Lock zu erwirken ist überflüssig, weil du dann ja längst an der Datei herumgearbeitet hast und das ftruncate() ist nutzlos, weil die Datei dann eh schon längst die Größe 0 hat.  
  
Korrekterweise solltest du die Datei im Modus "r+" Öffnen, dann den Schreib-Lock erwirken und dann ftruncate($fp, 0) machen.  
  
Die Modi "w" und "w+" sollte man - wenn auch nur irgendwie ein bisschen Wert auf simultanen Dateizugriff legt - grundsätzlich NIE verwenden. Seit PHP 5.2.6 wurden deshalb die Modi "c" und "c+" eingeführt, welche sich im Prinzip wie "w" und "w+" verhalten, jedoch die Datei nicht leeren.  
  
  
Viele Grüße,  
  ~ Dennis.

-- 
Mein [SelfCode](http://community.de.selfhtml.org/fanprojekte/selfcode.htm): [ie:{ fl:( br:> va:) ls:\[ fo:) rl:( n4:# ss:) de:\] js:| ch:{ sh:| mo:} zu:|](http://www.peter.in-berlin.de/projekte/selfcode/?code=ie%3A%7B+fl%3A%28+br%3A%3E+va%3A%29+ls%3A%5B+fo%3A%29+rl%3A%28+n4%3A%23+ss%3A%29+de%3A%5D+js%3A%7C+ch%3A%7B+sh%3A%7C+mo%3A%7D+zu%3A%7C)