Thomas Schmieder: Langes Posting nicht möglich?

Beitrag lesen

Hallo Christian,

wenn es so ist, wie Du schreibst, dann wäre ich beruhigt. Das würde dann bedeuten, dass flock() in PHP dafür sorgt, dass auch kein Zugriff auf die Datei über die Console möglich wäre, solange das Script sperrt.

---------------
http://www.php.net/manual/de/function.flock.php
Beschreibung
bool flock ( int fp, int operation [, int wouldblock])

PHP liefert einen portablen Weg, Dateien in einer "beratenden" Art und Weise zu verriegeln. D.h. alle zugreifende Programme müssen die gleiche Art und Weise der Verriegelung benutzen, oder es funktioniert nicht.
---------------
"beratende" Art und Weise würde bedeuten, dass eine separate Nachschlagedatei geführt wird, in die jedes Script reinschauen muss. Die eigentliche Datendatei wird nicht auf Systemebene gesperrt. Ich untersuche das nochmal genauer.

Wie ist das dann mit der Freigabe des Locks beim Zurückgeben des Handles?

Wo hast Du denn das her, Thomas? Ich hab' mir gerade mal den Quelltext (was liebe ich nicht OpenSource) von PHP angeschaut (im Manual stand nix von einer flock()-Tabelle, sondern von Dateisystemebene) und dort steht für UNIX-Betriebsysteme:

Wo finde ich den Quellcode? Ist der in C oder C++?
Ich glaube, dann erde ich mich da auchmal einlesen.

ret = fcntl(fd, operation & LOCK_NB ? F_SETLK : F_SETLKW, &flck);

(da gibt's noch mehr von diesen Funktionsaufrufen)

Das ist schon auf Kernel-Elene.

Gibts da inzwischen auch Record- oder Bereichs-Locks?

Ach ja, nur so nebenbei, laut Manual sind die ganzen Zahlen (zweiter Parameter) jetzt (seit PHP 4.0.1) als Konstanten definiert.

Ja wieso? Alle UNIX-Derivate unterstützen fcntl(), das ist POSIX (Layer 2, glaube ich), und für Win32 ist extra-Code eingebaut. Und AFAIK läuft PHP auf nix anderem. Und wenn der Apache auf noch zusätzlichen Betriebsystemen läuft, bringt das dem PHP-User wenig.

Übrigens sollte man zur Vermeidung von Deadlocks keine Endlosschleifen programmieren. Fünf Lockingversuche sollten da also reichen. Ich denke, PHP wird selber schon mehrmals nachschauen (in Millisekunden-Abständen), bevor es die Anfrage ablehnt (false zurückgibt).

Nein. Laut Sourcecode (ext/standard/flock_compat.c) wird nach einem Fehler sofort an das Script zurückgegeben. Ich halte 10 Versuche für OK. Übrigens: Endlosschleifen braucht man gar nicht, den dritten Parameter zu setzen reicht.

Das gäbe dann also ggf. auch einen "Deadlock", wenn sich da zwei Prozesse mit den Lockinglevels gegenseitig verbeißen.

Nun wollen wir das ganz gewiss genau wissen, damit unsere Progs dann auch mit den Perlies mithalten können :-))

Danke Dir für die Info.

Grüße

Tom