Мой сервер использует 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