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?

rFactor
fonte

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

Josip Rodin
fonte
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.

janneb
fonte
+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.

Insyte
fonte
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

rFactor
fonte
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