Christian Seiler: Langes Posting nicht möglich?

Beitrag lesen

Hallo Thomas und Fabian,

Ich wollte eigentlich hier auch nur sicher gehen, dass Du den Mechanismus von flock() in PHP durchschaust. Die Datei wird nämlich nicht gelockt, sondern es wird in einer flock-Tabelle ein Eintrag hinterlegt. Ich bin mir noch nicht einmal sicher, dass der ohne unlock (also flock($fp,3)) wieder beseitigt wird. Mir wäre hier ein Durchgriff auf das Betriebssystem lieber, auch wenn das nicht ganz "sauber" ist. Linux muss doch auch über Locking-Mechanismen verfügen.

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:

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

Wenn das nicht eine Kernel-Locking-Anweisung ist, was dann? Und für Win32:

if (LockFileEx(hdl, LOCKFILE_EXCLUSIVE_LOCK +
                        ((operation & LOCK_NB) ? LOCKFILE_FAIL_IMMEDIATELY : 0)
                           0, low, high, &offset))

(da gibt's noch mehr von diesen Funktionsaufrufen)

Das ist schon auf Kernel-Elene.

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

Ich hab's gerade nochmal in SelfPHP und der Doku nachgeschaut. Ist tatsächlich so, dass man im dritten Parameter die "Blockkonditionen" reinschreiben kann, sprich _wofür_ die Datei gelockt ist, wenn wir das noch einbauen isses perfekt ;)

Wie meinen? Der dritte Parameter gibt doch an, ob der aufruf "blockieren" soll, d.h. so lange warten, bis das Lock freigegeben ist.

Der Durchgriff auf's Betriebsystem geht nicht, weil der Apache ja nicht nur auf Linux läuft und nun stell dir vor, sowas für alle möglichen Plattformen programmieren zu müssen ;-))

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.

Grüße,

Christian