Hello,
sorry, ich verstehe es einfach nicht. :-(
if (!flock ($fp, LOCK_EX)) {
die ('Sperren der Datei fehlgeschlagen!');
}
macht nichts, das kann jedem passieren :-)
$lock_ok = flock ($fp, LOCK_EX);
if (!$lock_ok ($fp, LOCK_EX))
{
die ('Sperren der Datei fehlgeschlagen!');
}
Ich habe es Dir mal umgeschrieben.
Im Prinzip sind beide Codestücke gleich. Einziger Unterschied ist nur, dass das Ergebnis der Lock-Funktion im ersten Codebeispiel nicht zwischengespeichert wird, sondern sofort weiterverwendet wird für den Vergleich. Wenn der Vergleich endet, ist das Ergebnis nicht mehr vorhanden.
Außerdem muss man zum Verständnis dieses Codestückchens wissen, dass flock() in der obigen Anwendungsart intern eine Schleife aufmacht (Warteschleife), die solange automatisch versucht, die _vorhandene_ Ressource $fp zu sperren, bis sie Erfolg hatte. Der Programmfluss ist also an dieser Stelle bis zum erfolgreichen Lock unterbrochen.
Es geht nur dann weiter, wenn ein Fehler auftrat. Wenn z.B. die Ressource nicht vorhanden ist, die gesperrt werden soll (ein ungültiges Handle übergeben wurde), dann bricht flock() den Lockversuch mit 'false' ab. Genau dieser Fall wird hier mit if() abgefragt.
Wenn man nicht will, dass das Programm an dieser Stelle wartet, muss man flock() im sogenannten "NON-BLOCKING-MODE" aufrufen. Dann führt es nur eine begrenzte Anzahl von Lockversuchen durch (z.B. 5 Versuche im Abstand von 5ms) und bricht ab, wenn kein Lock möglich war.
Allerdings funktioniert es gerade mal nicht in
PHP-Version: 5.2.0-8+etch10
Ich wollte ein Beispiel bereitstellen, aber das flock() wartet immer. Es kann nicht in den Non-Blocking-Mode geschaltet werden. Muss ich also erst herausfinden, woran es liegt.
<?php ### flock.php ###
error_reporting(E_ALL);
echo "PHP-Version: ".phpversion()."<br>";
$filename = 'dummy.txt';
if (!file_exists($filename))
{
touch($filename);
}
$fh = fopen($filename,'rb'); ## absichtlich ungültiges File-Handle produzieren.
$err = false;
$ok = flock($fh, (LOCK_EX + LOCK_NB); # , $err); # Zum Testen, was wouldblock macht...
echo "Ergebnis des Lockversuches auf <b>$filename</b> ist ".(($ok)?'TRUE':'FALSE')."<br>";
echo "Error ist: $err (".(($err)?'TRUE':'FALSE').")<br>";
flush(); ## obige Ausgaben an den Browser schicken.
sleep(15); ## warten, um bei einem zweiten Aufruf des Scriptes das Lock zu verweigern.
echo "<br>fertig<br>";
?>
Ein harzliches Glückauf
Tom vom Berg