Hi,
Das ist mir klar. Aber da entsteht ein Time Gap, wenn die Datei NICHT vorhanden ist, und daher angelegt werden muss. Der a+-Mode macht das in einem Zug und man muss das Handle nicht wieder hergeben.
Ich muss zugeben, dass ich davon ausgegangen bin, die Datei existiert. Dennoch ist der a+-Modus, der zwar in diesem speziellen Fall bequemer (und wahrscheinlich auch schneller) ist, m.E. der falsche Weg.
Bliebe noch der x+-Mode, aber den gibt es erst ab PHP 4.3.2
...und bricht im Falle der Existenz ab. Man müsste also trotzdem auf Existenz prüfen.
- fopen('r+b') ## wenn die Datei nicht vorhanden ist, könnte man sie anschließend gleich
## mit w+ aufrufen. Dabei könnte es aber passieren, dass jemand zwischen
## r+ -> Fehler und w+ die Datei bereits gesperrt hat, wovon w+ aber
## bei advisory Locking leider nichts mitbekommt. Und futsch ist die neue
## Datei des Anderen Prozesses.
## bleibt also zum Anlegen nur das Verzeichnis-Locking.
Ich würde mir das eher so vorstellen:
<?php
if (!file_exists($dateiname))
{
touch($dateiname);
}
fopen($dateiname, 'r+b');
// ...
?>
Das ist IMHO der sauberste Weg. Dieses Vorgehen sollte zeitkritisch kein Problem sein (etwas anderes dürfte der a+-Mode ja auch nicht machen) und das Problem mit dem advisory Locking hätte sich auch erledigt. Alternativ könnte man die Datei natürlich im Falle der Nicht-Existenz mit w+ öffnen und in einem else-Teil mit r+ - das dürfte aber keinen Unterschied machen.
Weißt Du, wo man die Sourcen für PHP auf Windows finden kann? Ich habe schon alles mögliche durchgesucht. Ich will mir das gerne mal ansehen, wie die Filefunktionen implementiert sind.
Leider nicht - ich werde mich aber auch mal auf die Suche machen.
Erstmal aber noch mein Dank für die Unterstützung; ich hoffe er erreicht Dich auch.
tut er. War aber selbstverständlich - dein Artikel interessiert mich auch ;-)
Gruß,
Andreas.