Flock funktioniert nicht mit LOCK_NB bei meinem Server?
Herzlicher
- php
0 Herzlicher0 Pete0 Herzlicher0 ChrisB
0 fflush() vor LOCK_UN
Tom
Hallo,
wollte die Flock-Unterstützung meines Webspaces (bei All-Inkl) mit folgendem Script testen:
<?php
$content = "";
$input = fopen ("lock_test.txt", "a");
if (flock ($input, LOCK_EX | LOCK_NB) == true){
echo "in...<br/>";
for($i=1;$i<10;$i++) {
fwrite($input,"$i\n");
sleep (1);
}
echo "out...<br/>";
flock ($input, LOCK_UN);
}
else echo "can't acquire block...";
fclose ($input);
//sleep () was used to give myself enough time to switch to another browser window,
//invoke the script again to guarantee parallelism and make the notepad test to see
//if an error occurred with other proccess
?>
Der Flock an sich funktioniert bei parallelem Aufruf, d.h. 2 Instanzen kommen sich nicht in die Quere, erst schreibt das eine zuende, dann das zweite. Jedoch wird vom LOCK_NB-Attribut ("non blocking") erwartet, dass ein zweites Skript bei Flock false zurückgibt und somit nicht in einer Warteschleife verharrt.
Auf meinem Server ist php 5.2.5 installiert. Wenn man googlet merkt man, dass es sich wohl um einen Bug in manchen (früheren 5er) php-Versionen handelt.
Weiß hier jemand eine Lösung?
Haben andere all-inkl-Kunden dasselbe Problem?
Danke und Gruß
Herzlicher
... es scheint sich um einen Firefox-Bug zu handeln. Wenn ich die Seite im IE7 2x hintereinander aufrufe, reagiert das Skript wie gewollt.
Das kann jeder testen unter: http://www.unicp.de/tests/flock_test.php
Einfach in 2 Tabs kurz hintereinander starten.
Hi,
... es scheint sich um einen Firefox-Bug zu handeln. Wenn ich die Seite im IE7 2x hintereinander aufrufe, reagiert das Skript wie gewollt.
Clientseitig soll das Einfluss haben? Schwer zu glauben.
Das kann jeder testen unter: http://www.unicp.de/tests/flock_test.php
Einfach in 2 Tabs kurz hintereinander starten.
Ja habe ich gemacht IE6, Entweder Wartezeit oder wenn ich während Wartezeit nochmal anfordere kommt "can't acquire block... ".
Pete
Hallo Pete,
hast du es mal unter Firefox versucht?
Ich bin über einen Thread in einem anderen Forum darauf gekommen, wo dasselbe festgestellt wurde.
Hi,
hast du es mal unter Firefox versucht?
Hast du es mal im Firefox *unter*sucht?
HTTP-Header, allgemeiner Ablauf, etc. - das waere mal interessant.
MfG ChrisB
Hello,
<?php
$content = "";
$input = fopen ("lock_test.txt", "a");
if (flock ($input, LOCK_EX | LOCK_NB) == true)
{
echo "in...<br/>";
for($i=1;$i<10;$i++)
{
fwrite($input,"$i\n");
sleep (1);
}
echo "out...<br/>";
flock ($input, LOCK_UN);
}
else echo "can't acquire block...";
fclose ($input);?>
Generell ist dazu zu sagen, dass das flock ($input, LOCK_UN) meistens die falsche Wahl ist, sondern stattdessen fclose($input) Verwendung finden müsste. In Mehrnutzerumgebungen muss man Dateien entweder geschlossen halten oder in einem kontrollierten Zustand.
Das Offenhalten ohne auch eine Lockingstufe zu halten ist gefährlich, da Veränderungen ggf. erst mit dem fclose() geschrieben werden. Wenn man das selber auch noch vergisst, dann wirds noch interessanter, insbesondere, wenn man Files in Funktionen oder Schleifen öffnet.
Bevor man also flock($fh, LOCK_UN) benutzt, muss nach einem schreibenden Zugriff auf jeden Fall fflush() verwendet werden. http://de2.php.net/manual/en/function.fflush.php
Das war jetzt sicher nicht die Aufgabenstellung Deines Scriptes, aber bevor sich hier im Archiv halbe Beispiele breit machen, wollte ich es erwähnt haben.
Ein harzliches Glückauf
Tom vom Berg
http://bergpost.annerschbarrich.de