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?
fonte
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?
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
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.
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/hosts
nas duas máquinas.fonte
Só queria responder para mim mesmo. A solução pode ser encontrada aqui: http://us3.php.net/manual/en/function.flock.php#82521
fonte