Bloqueios de arquivo em um NFS?


18

Meu servidor usa NFS (sistema de arquivos de rede) e não consigo usar a função flock () do PHP. Existe uma maneira de bloquear arquivos em um NFS ou é necessário fazer isso?

Respostas:


11

A página do manual flock(2)estava desatualizada há muito tempo, mas foi atualizada para dizer (grifo meu):

Desde o Linux 2.6.12, os clientes NFS suportam bloqueios flock () emulando-os como bloqueios de intervalo de bytes em todo o arquivo. Isso significa que os bloqueios fcntl (2) e flock () interagem entre si pelo NFS. Desde o Linux 2.6.37, o kernel suporta um modo de compatibilidade que permite que bloqueios flock () (e também bloqueios de região de bytes fcntl (2)) sejam tratados como locais; veja a discussão da opção local_lock em nfs (5).

Isso é do site oficial das páginas de manual, http://man7.org/linux/man-pages/man2/flock.2.html , que mostra a nova versão das páginas de manual 4.00

O Linux 2.6.12 foi lançado em 2005.

Originalmente, isso era para ser um comentário sobre a resposta de janneb, mas eu não tinha a reputação na época. A atualização do documento ocorreu em 2014: http://git.kernel.org/cgit/docs/man-pages/man-pages.git/commit/man2/flock.2?id=e449654fdb3f19aafc569df47d12bffdf6276236


11

Não sei como a flock()função PHP é implementada, mas, assumindo que é uma interface para o flock()syscall, ela não funciona em todo o NFS. Na página de flock()manual:

O rebanho (2) não bloqueia arquivos pelo NFS. Em vez disso, use fcntl (2): isso funciona com o NFS, dada uma versão suficientemente recente do Linux e um servidor que suporta bloqueio.

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


+1, sarcasmo! O item D10 nas perguntas frequentes do NFS é elaborado.
themel

8

flock()funciona bem no Linux NFS, inclusive no PHP. Nós o usamos extensivamente e o testamos minuciosamente para verificar se está funcionando como 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 sendo executados, você precisa descobrir qual script init os inicia na sua distribuição. Nas distribuições baseadas no Debian são " /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 instalação, recebo o "programa 100024 versão 1 pronto e aguardando" como resultado.

Ah, também, lembre-se de 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 ​​um para o outro. Verifique novamente /etc/hostsnas duas máquinas.


1
Não estou em condições de alterar detalhes específicos do servidor. A função flock () é desativada até mesmo do php.ini, porque não funcionaria, pelo menos é o que me disseram.
rFactor

3

Só queria responder para mim mesmo. A solução pode ser encontrada aqui: http://us3.php.net/manual/en/function.flock.php#82521


3
A segunda opção listada é exatamente o que eu descrevo: usando o servidor de bloqueio interno no Linux NFS. As etapas de solução de problemas foram projetados para determinar por que (aparentemente) não estava funcionando ...
INSYTE
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.