Файл блокируется на NFS?

18

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

RFactor
источник

Ответы:

11

Страница руководства 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

Иосип Роден
источник
11

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

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

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

janneb
источник
+1, сарказм! Пункт D10 в FAQ NFS уточняет.
themel
8

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

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

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

Insyte
источник
1
Я не могу изменить детали сервера. Функция flock () даже отключена из php.ini, потому что она не будет работать, по крайней мере, так мне сказали.
rFactor
3

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

RFactor
источник
3
Второй перечисленный вариант - именно то, что я описываю: использование встроенного сервера блокировки в Linux NFS. Шаги устранения неполадок были разработаны, чтобы определить, почему он (по-видимому) не работал ...
Insyte