@fab
Ehrlich gesagt ich weiß es nicht, ich habe folgendes Testszenario gemacht - natürlich auch möglich das ich was verbockt hab.
Das Script in einem Browser normal aufgerufen und in einem zweiten mit dem Get-Parameter ?sleep=ja. Siehe unten die *** markierten Zeilen. Damit wollte ich das Script einige Sekunden schlafen lassen um einen zwischenzeitlichen Zugriff über einen zwieten Browser zu erzwingen.
Während dieses Aufrufes mit sleep hatte ich im anderen Browser (ohne dem get-Parameter sleep) aufgerufen und ebenfalls diesen aktualisiert. Der Browser ohne get/seep hat dann meistens auch brav abgewartet bis der andere mit sleep fertig war aber in einigen Fallen dann doch eine Warnung ausgegeben, das fread() fehlgeschlagen ist, weil bei filesize() die Größe 0 zurückgegeben wurde. Und dann war der Coutner Wert plötzlich wieder 0.
Wie gesagt das war nur selten und nicht gezielt reprodzuierbar, muss das heute noch etwas anschauen, ev. hab ich da was verbockt, oder PHP im Multithread laufen
Ev. macht eh die Variante von jspit da mehr Sinn, weil wenn einer fehlt is mir das echt egal... nur 0 is doof.
PHP-Code:
$file = "counter.txt";
$handle = fopen($file, 'r+');
if (!is_resource($handle)) {
die ('Konnte die Datei '.$file.' nicht öffnen!');
}
if (!flock($handle, LOCK_EX)) {
die ('Sperren der Datei '.$file.' fehlgeschlagen!');
}
// lesen + increment
$curVal = (int)fread($handle, filesize($file)) + 1 ; // *** WARN hier ***
rewind($handle);
ftruncate($handle, 0);
if (!empty($_GET["sleep"])) sleep(3); // *** sleep ***
// schreiben
fwrite($handle, (string)$curVal);
fclose($handle);
echo "Zähler: ".$curVal;