Risposte:
La pagina del manuale flock(2)
era obsoleta da molto tempo, ma da allora è stata aggiornata per dire (enfasi mia):
A partire da Linux 2.6.12, i client NFS supportano i blocchi flock () emulandoli come blocchi a intervallo di byte sull'intero file. Ciò significa che i blocchi fcntl (2) e flock () interagiscono tra loro su NFS. A partire da Linux 2.6.37, il kernel supporta una modalità di compatibilità che consente ai blocchi flock () (e anche i blocchi fcntl (2) byte region) di essere trattati come locali; vedere la discussione dell'opzione local_lock in nfs (5).
Questo è dal sito ufficiale delle pagine man, http://man7.org/linux/man-pages/man2/flock.2.html che mostra la nuova versione dalle pagine man 4.00
Linux 2.6.12 è stato rilasciato nel 2005.
Inizialmente questo doveva essere un commento sulla risposta di Janneb, ma all'epoca non avevo la reputazione. L'aggiornamento del documento è avvenuto nel 2014: http://git.kernel.org/cgit/docs/man-pages/man-pages.git/commit/man2/flock.2?id=e449654fdb3f19aafc569df47d12bffdf6276236
Non so come flock()
sia implementata la funzione PHP , ma supponendo che sia un'interfaccia per il flock()
syscall, quindi non funziona affatto su NFS. Dalla flock()
manpage:
flock (2) non blocca i file su NFS. Usa invece fcntl (2): funziona su NFS, data una versione sufficientemente recente di Linux e un server che supporta il blocco.
E, naturalmente, tutto ciò che dice una pagina man, non importa quanto obsoleto, è la verità assoluta.
flock()
funziona perfettamente su Linux NFS, incluso PHP. Lo usiamo ampiamente e lo abbiamo testato a fondo per verificare che funzioni come desiderato. Controlla se stai eseguendo tutti i servizi necessari sia sul client che sul server. Cerca "portmapper" e "rpc.statd". Se non sono in esecuzione, devi capire quale script init li avvia sulla tua distribuzione. Nelle distribuzioni basate su Debian è " /etc/init.d/portmap
" e " /etc/init.d/nfs-common
".
Dal client, esegui " rpcinfo -u $NFSSERVER status
" e vedi se ottieni una risposta. Sulla mia installazione, ottengo "programma 100024 versione 1 pronto e in attesa" come risultato.
Oh, tieni anche presente che in alcune circostanze NFS e statd possono arrabbiarsi se sia il client che il server non dispongono di voci di nome host affidabili l'una per l'altra. Doppio controllo /etc/hosts
su entrambe le macchine.
Volevo solo rispondere a me stesso. La soluzione è disponibile qui: http://us3.php.net/manual/en/function.flock.php#82521