Назад | Перейти на главную страницу

Блокировки файлов в NFS?

Мой сервер использует NFS (сетевая файловая система), и я не могу использовать PHP-функцию flock (). Есть ли способ заблокировать файлы в NFS или в этом есть необходимость?

Я не знаю, как PHP flock() функция реализована, но при условии, что это интерфейс к flock() syscall, то по NFS он вообще не работает. Из flock() страница руководства:

flock (2) не блокирует файлы через NFS. Вместо этого используйте fcntl (2): это работает через NFS, учитывая достаточно последнюю версию Linux и сервер, поддерживающий блокировку.

И, конечно же, все, что написано на странице руководства, независимо от того, насколько она устарела, является истиной в последней инстанции.

Страница руководства flock(2) был устаревшим в течение долгого времени, но с тех пор был обновлен, чтобы сказать (выделено мной):

Начиная с Linux 2.6.12, Клиенты NFS поддерживают блокировки flock (), эмулируя их как блокировки диапазона байтов для всего файла. Это означает, что блокировки fcntl (2) и flock () действительно взаимодействуют друг с другом через NFS. Начиная с Linux 2.6.37, ядро ​​поддерживает режим совместимости, который позволяет обрабатывать блокировки flock () (а также блокировки байтовых областей fcntl (2)) как локальные; см. обсуждение параметра local_lock в nfs (5).

Это с официального веб-сайта man-страниц, http://man7.org/linux/man-pages/man2/flock.2.html который показывает новую версию из man-страниц 4.00

Linux 2.6.12 был выпущен в 2005 году.

Изначально это должно было быть комментарием к ответу Яннеба, но в то время у меня не было такой репутации. Обновление документа произошло в 2014 году: http://git.kernel.org/cgit/docs/man-pages/man-pages.git/commit/man2/flock.2?id=e449654fdb3f19aafc569df47d12bffdf6276236

flock() отлично работает с Linux NFS, в том числе с PHP. Мы активно его используем и тщательно протестировали, чтобы убедиться, что он работает должным образом. Убедитесь, что вы запускаете все необходимые службы как на клиенте, так и на сервере. Найдите "portmapper" и "rpc.statd". Если они не работают, вам нужно выяснить, какой сценарий инициализации запускает их в вашем дистрибутиве. В дистрибутивах на основе Debian это "/etc/init.d/portmap" и "/etc/init.d/nfs-common".

На клиенте запустите "rpcinfo -u $NFSSERVER status"и посмотрите, получите ли вы ответ. В моей настройке я получаю" программа 100024 версии 1 готова и ждет "в качестве результата.

О, также имейте в виду, что в некоторых случаях NFS и statd могут расстроиться, если и клиент, и сервер не имеют надежных записей имен хостов друг для друга. Двойная проверка /etc/hosts на обеих машинах.

Просто хотел ответить самому себе. Решение можно найти здесь: http://us3.php.net/manual/en/function.flock.php#82521