Blocchi di file su un NFS?


18

Il mio server utilizza NFS (Network File System) e non riesco a utilizzare la funzione flock () di PHP. Esiste un modo per bloccare i file su un NFS o è necessario farlo?

Risposte:


11

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


11

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.


+1, sarcasmo! Viene elaborato l'articolo D10 nelle FAQ di NFS .
themel

8

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/hostssu entrambe le macchine.


1
Non sono davvero in grado di modificare i dettagli specifici del server. La funzione flock () è persino disabilitata da php.ini, perché non funzionerebbe, almeno è quello che mi è stato detto.
rFactor

3

Volevo solo rispondere a me stesso. La soluzione è disponibile qui: http://us3.php.net/manual/en/function.flock.php#82521


3
La seconda opzione elencata è esattamente ciò che descrivo: usando il server di blocco integrato in Linux NFS. I passaggi per la risoluzione dei problemi sono stati progettati per determinare perché (apparentemente) non funzionava ...
Insyte
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.