Hiho,
flock() arbeitet auf Multithreaded Server nicht und ich vermute da den eigentlichen Grund für das Fehlschagen des Scripts.
Hmm, hab gerade mal ein (bzw. 2) Testscript gebaut.
test1.php:
<?php
$fp = fopen("test.stadb","r+");
echo time() . ": 1 geöffnet<br>";
flock($fp, LOCK_EX);
echo time() . ": 1 gesperrt<br>";
$count = chop(fread($fp, 1024));
echo time() . ": 1 gelesen - " . $count . "<br>";
sleep(10);
rewind($fp);
ftruncate($fp,0);
fwrite($fp, "von 1 geschrieben");
fclose($fp);
echo time() . ": 1 geschlossen<br>";
?>
test2.php:
<?php
$fp = fopen("test.stadb","r+");
echo time() . ": 2 geöffnet<br>";
flock($fp, LOCK_EX);
echo time() . ": 2 gesperrt<br>";
$count = chop(fread($fp, 1024));
echo time() . ": 2 gelesen - " . $count . "<br>";
rewind($fp);
ftruncate($fp,0);
fwrite($fp, "geschrieben von zwei");
fclose($fp);
echo time() . ": 2 geschlossen<br>";
?>
Dann die beiden Scripte nacheinander gestartet. Und wie gewünscht wartet test2.php so lange bis test1.php fertiggelaufen ist und die datei wieder schließt. Das sind die Ausgaben, die ich erhalte:
test1.php:
1146915771: 1 geöffnet
1146915771: 1 gesperrt
1146915771: 1 gelesen - von 1 geschrieben
1146915781: 1 geschlossen
test2.php:
1146915773: 2 geöffnet
1146915781: 2 gesperrt
1146915781: 2 gelesen - von 1 geschrieben
1146915781: 2 geschlossen
Ich denke, dass heisst doch das das flock() funktioniert, oder? Denn obwohl ich test2.php nur 2 Sekunden nach test1.php gestartet habe hat er bis zum Ende von test1 gewartet, bis er die Datei sperren konnte.
Ist an meiner Versuchsanordnung irgendwas nicht in Ordnung, oder habe ich sonst irgendwas falsch gemacht? Und falls nein: Irgendwelche anderen Ideen, wie es sein kann, dass plötzlich negative Zahlen von meinem Ausgangsscript produziert werden?
Oder kann es sein, das flock() nicht immer zuverlässig arbeitet?
Grüße
Marc