Мой сервер использует NFS (сетевую файловую систему), и я не могу использовать PHP-функцию flock (). Есть ли способ заблокировать файлы в NFS или это необходимо сделать?
источник
Мой сервер использует NFS (сетевую файловую систему), и я не могу использовать PHP-функцию flock (). Есть ли способ заблокировать файлы в NFS или это необходимо сделать?
Страница руководства 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()
реализована функция PHP , но если предположить, что это интерфейс для flock()
системного вызова, то он не работает вообще по NFS. Из flock()
справочной страницы:
flock (2) не блокирует файлы через NFS. Вместо этого используйте fcntl (2): он работает через NFS, учитывая достаточно последнюю версию Linux и сервер, который поддерживает блокировку.
И, конечно, все, что говорит страница руководства, независимо от того, насколько она устарела, является абсолютной истиной.
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
на обеих машинах.источник
Просто хотел ответить самому себе. Решение можно найти здесь: http://us3.php.net/manual/en/function.flock.php#82521
источник