Só queria responder para mim mesmo. A solução pode ser encontrada aqui: link
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?
Só queria responder para mim mesmo. A solução pode ser encontrada aqui: link
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.
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.
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.