Odpowiedzi:
Strona podręcznika flock(2)
była nieaktualna przez długi czas, ale od tego czasu została zaktualizowana, aby powiedzieć (wyróżnienie moje):
Od Linuksa 2.6.12 klienci NFS obsługują blokady flock (), emulując je jako blokady zakresu bajtów w całym pliku. Oznacza to, że blokady fcntl (2) i flock () współdziałają ze sobą przez NFS. Od Linuksa 2.6.37 jądro obsługuje tryb zgodności, który pozwala na traktowanie blokad flock () (a także blokad regionu bajtów fcntl (2)) jako lokalnych; zobacz omówienie opcji local_lock w nfs (5).
To jest z oficjalnej strony man-pages, http://man7.org/linux/man-pages/man2/flock.2.html, która pokazuje nową wersję z man-pages 4.00
Linux 2.6.12 został wydany w 2005 roku.
Pierwotnie miał to być komentarz do odpowiedzi janneb, ale nie miałem wtedy reputacji. Aktualizacja dokumentu miała miejsce w 2014 r .: http://git.kernel.org/cgit/docs/man-pages/man-pages.git/commit/man2/flock.2?id=e449654fdb3f19aafc569df47d12bffdf6276236
Nie wiem jak flock()
implementowana jest funkcja PHP , ale zakładając, że jest to interfejs do flock()
syscall, to w ogóle nie działa w NFS. Z strony flock()
podręcznika:
flock (2) nie blokuje plików przez NFS. Zamiast tego użyj fcntl (2): działa to na NFS, biorąc pod uwagę wystarczająco nową wersję Linuksa i serwer obsługujący blokowanie.
I oczywiście wszystko, co mówi strona podręcznika, bez względu na to, jak jest przestarzałe, jest ostateczną prawdą.
flock()
działa dobrze w systemie Linux NFS, w tym z PHP. Używamy go szeroko i dokładnie przetestowaliśmy, aby sprawdzić, czy działa zgodnie z oczekiwaniami. Sprawdź, czy korzystasz z wszystkich niezbędnych usług na kliencie i serwerze. Poszukaj „portmapper” i „rpc.statd”. Jeśli nie są uruchomione, musisz dowiedzieć się, który skrypt inicjujący uruchamia je w twojej dystrybucji. W dystrybucjach opartych na Debianie jest to „ /etc/init.d/portmap
” i „ /etc/init.d/nfs-common
”.
Od klienta uruchom „ rpcinfo -u $NFSSERVER status
” i sprawdź, czy otrzymasz odpowiedź. W mojej konfiguracji otrzymuję „program 100024 wersja 1 gotowy i czeka”.
Och, pamiętaj również, że w niektórych okolicznościach NFS i statd mogą się zdenerwować, jeśli zarówno klient, jak i serwer nie mają wzajemnie wiarygodnych nazw hostów. Sprawdź dwukrotnie /etc/hosts
na obu maszynach.
Chciałem tylko odpowiedzieć sobie. Rozwiązanie można znaleźć tutaj: http://us3.php.net/manual/en/function.flock.php#82521