Plik blokuje się w systemie plików NFS?

18

Mój serwer używa NFS (Network File System) i nie mogę użyć funkcji flock () PHP. Czy istnieje sposób na zablokowanie plików w systemie plików NFS lub istnieje taka potrzeba?

rFactor
źródło

Odpowiedzi:

11

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

Josip Rodin
źródło
11

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ą.

janneb
źródło
+1, sarkazm! Opracowano punkt D10 w FAQ NFS .
themel
8

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/hostsna obu maszynach.

Insyte
źródło
1
Naprawdę nie jestem w stanie zmienić szczegółowych danych serwera. Funkcja flock () jest nawet wyłączona w php.ini, ponieważ nie działałaby, przynajmniej tak mi powiedziano.
rFactor
3

Chciałem tylko odpowiedzieć sobie. Rozwiązanie można znaleźć tutaj: http://us3.php.net/manual/en/function.flock.php#82521

rFactor
źródło
3
Druga wymieniona opcja jest dokładnie tym, co opisuję: za pomocą wbudowanego serwera blokady w systemie Linux NFS. Kroki rozwiązywania problemów zostały zaprojektowane w celu ustalenia, dlaczego (najwyraźniej) nie działa ...
Insyte,