Mein Server verwendet NFS (Network File System) und ich kann die flock () -Funktion von PHP nicht verwenden. Gibt es eine Möglichkeit, Dateien auf einem NFS zu sperren, oder muss dies getan werden?
quelle
Mein Server verwendet NFS (Network File System) und ich kann die flock () -Funktion von PHP nicht verwenden. Gibt es eine Möglichkeit, Dateien auf einem NFS zu sperren, oder muss dies getan werden?
Die Handbuchseite flock(2)
war lange nicht mehr aktuell, wurde aber seitdem aktualisiert, um Folgendes zu sagen (Hervorhebung meiner):
Seit Linux 2.6.12 unterstützen NFS-Clients flock () -Sperren, indem sie sie als Bytebereichsperren für die gesamte Datei emulieren. Dies bedeutet, dass die Sperren fcntl (2) und flock () über NFS miteinander interagieren. Seit Linux 2.6.37 unterstützt der Kernel einen Kompatibilitätsmodus, mit dem flock () -Sperren (und auch fcntl (2) -Byte-Regionssperren) als lokal behandelt werden können. Siehe die Diskussion der Option local_lock in nfs (5).
Das ist von der offiziellen Hilfeseiten-Website http://man7.org/linux/man-pages/man2/flock.2.html, die die neue Version von Hilfeseiten 4.00 zeigt
Linux 2.6.12 wurde 2005 veröffentlicht.
Dies sollte ursprünglich ein Kommentar zu Jannebs Antwort sein, aber ich hatte zu diesem Zeitpunkt keinen guten Ruf. Die Aktualisierung des Dokuments erfolgte 2014: http://git.kernel.org/cgit/docs/man-pages/man-pages.git/commit/man2/flock.2?id=e449654fdb3f19aafc569df47d12bffdf6276236
Ich weiß nicht, wie die PHP- flock()
Funktion implementiert ist, aber wenn es sich um eine Schnittstelle zum flock()
Syscall handelt, funktioniert sie über NFS überhaupt nicht. Aus der flock()
Manpage:
flock (2) sperrt keine Dateien über NFS. Verwenden Sie stattdessen fcntl (2): Dies funktioniert über NFS, wenn eine ausreichend aktuelle Linux-Version und ein Server vorhanden sind, der das Sperren unterstützt.
Und natürlich ist alles, was eine Manpage sagt, egal wie veraltet, die ultimative Wahrheit.
flock()
Funktioniert gut unter Linux NFS, auch von PHP. Wir verwenden es ausgiebig und haben es gründlich getestet, um sicherzustellen, dass es wie gewünscht funktioniert. Überprüfen Sie, ob Sie alle erforderlichen Dienste sowohl auf dem Client als auch auf dem Server ausführen. Suchen Sie nach "portmapper" und "rpc.statd". Wenn sie nicht ausgeführt werden, müssen Sie herausfinden, welches Init-Skript sie auf Ihrer Distribution startet. In Debian-basierten Distributionen ist es "/etc/init.d/portmap
" und "/etc/init.d/nfs-common
".Führen Sie vom Client aus "
rpcinfo -u $NFSSERVER status
" aus und prüfen Sie, ob Sie eine Antwort erhalten. Bei meinem Setup erhalte ich als Ergebnis "Programm 100024 Version 1 bereit und wartet".Denken Sie auch daran, dass NFS und statd unter bestimmten Umständen verärgert sein können, wenn sowohl der Client als auch der Server keine zuverlässigen Hostnameneinträge für einander haben. Überprüfen Sie
/etc/hosts
beide Maschinen.quelle
Ich wollte nur auf mich selbst antworten. Die Lösung finden Sie hier: http://us3.php.net/manual/en/function.flock.php#82521
quelle