O arquivo é bloqueado em um NFS?

16

Meu servidor usa NFS (Network File System) e não consigo usar a função flock () do PHP. Existe uma maneira de bloquear arquivos em um NFS ou há necessidade de fazê-lo?

    
por rFactor 19.09.2009 / 08:21

4 respostas

2

Só queria responder para mim mesmo. A solução pode ser encontrada aqui: link

    
por 19.09.2009 / 16:27
9

Eu não sei como a função PHP flock () é implementada, mas assumindo que é uma interface para o flock () syscall, então ela não funciona em todo o NFS. A partir do flop () manpage:

   flock(2) does not lock files over NFS.  Use fcntl(2) instead: that does work over NFS, given
   a sufficiently recent version of Linux and a server which supports locking.

E, claro, tudo o que uma página de homem diz, não importa o quanto esteja desatualizado, é a verdade suprema.

    
por 13.10.2009 / 10:16
9

Isso foi feito para ser um comentário sobre a resposta de janneb acima, mas eu não tinha a reputação na época:

A página de manual estava desatualizada há muito tempo, mas desde então foi atualizada para dizer (ênfase minha):

In Linux kernels up to 2.6.11, flock() does not lock files over NFS (i.e., the scope of locks was limited to the local system). Instead, one could use fcntl(2) byte-range locking, which does work over NFS, given a sufficiently recent version of Linux and a server which supports locking. Since Linux 2.6.12, NFS clients support flock() locks by emulating them as byte-range locks on the entire file. This means that fcntl(2) and flock() locks do interact with one another over NFS. Since Linux 2.6.37, the kernel supports a compatibility mode that allows flock() locks (and also fcntl(2) byte region locks) to be treated as local; see the discussion of the local_lock option in nfs(5).

O site oficial de páginas de manual leva ao link que mostra a nova versão das páginas de manual 4.00

Atualização do Doc ocorreu em 2014: link

O Linux 2.6.12 foi lançado em 18 de junho de 2005 - quase uma década atrás.

    
por 19.05.2015 / 13:43
7

flock() funciona muito bem no Linux NFS, inclusive no PHP. Nós o usamos extensivamente e o testamos completamente para verificar se está funcionando conforme desejado. Verifique se você está executando todos os serviços necessários no cliente e no servidor. Procure por "portmapper" e "rpc.statd". Se eles não estiverem rodando, você precisa descobrir qual script de inicialização os inicia na sua distribuição. Em distros baseadas no Debian, é " /etc/init.d/portmap " e " /etc/init.d/nfs-common ".

No cliente, execute " rpcinfo -u $NFSSERVER status " e veja se você recebe uma resposta. Na minha configuração, recebo o "programa 100024 versão 1 pronto e aguardando" como resultado.

Ah, lembre-se também que, em algumas circunstâncias, o NFS e o statd podem ficar chateados se o cliente e o servidor não tiverem entradas de nome de host confiáveis para o outro. Verifique novamente /etc/hosts em ambas as máquinas.

    
por 19.09.2009 / 08:32