Hello,
der Punkt war mir noch wichtig, also der Prozess, der als Zweiter kommt wartet und geht nicht verloren ja?
Das ist abhängig vom Lock-Mode.
wenn Du schreibst
$lock = flock($fp,LOCK_EX);
wird das Programm in dieser Funktion solange "angehalten", bis sie erfolgreich war oder max_execution_time erreicht ist. dann wird das Script ja zwangsweise abgebrochen und nur noch der angemeldete Exit-Handler ausgeführt. Alle andere Anweisungen werden ignoriert.
Da das Timeout meistens auf 30 Sekunden steht (default), kann das für die Benutzer schon mal unangenehm werden. Außerdem wird das System 30 Sekunden lang mit nutzlosen Polls beschäftigt. Die Lockanfragen kommen eher zufällig beim OS an, also werden nicht unbedingt in der Reihenfolge des Eintreffens erledigt. Deshalb können die 30 Sekunden und damit das Timnout schon mal für einen einzelnen Benutzer eintreten, während andere aber schon nach e Sek Erfolg haben.
Wenn Du den Benutzer nicht quälen willst dann schreib so ungefähr:
for ($i=1; $i<5; $i++)
{
$lock = flock($fp, LOCK_EX + LOCK_NB);
if($lock) break; # Bei Erfolg Schleife abbrechen
usleep(8000); # 8ms warten, achtung geht nicht bei Win
}
if ($lock)
{
# weiterarbeiten
}
else
{
# Fehlerbehandlung. z.B. Meldung, dass die Datei zur Zeit gesperrt ist
# nicht vergessen, das Handle mit fclose() zurückzugeben [1]
}
[1] wenn das _Script_ sowieso terminiert, kann man darauf verzichen, sollte man aber im Interesse einer sauberen Programmierung nicht. Wenn nur die Funktion verlassen wird (return $fehlercode) dann _muss_ man das innerhalb der Funktion beschaffte Handle zurückgeben.
fLock() besorgt kein Handle, sondern verwendet nur ein durch fopen besorgtes.
Liebe Grüße aus http://www.braunschweig.de
Tom
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau