Le fichier se verrouille sur un NFS?

18

Mon serveur utilise NFS (Network File System) et je ne peux pas utiliser la fonction flock () de PHP. Existe-t-il un moyen de verrouiller des fichiers sur un NFS ou est-il nécessaire de le faire?

rFactor
la source

Réponses:

11

La page de manuel flock(2)était obsolète depuis longtemps, mais a depuis été mise à jour pour indiquer (soulignement le mien):

Depuis Linux 2.6.12, les clients NFS prennent en charge les verrous flock () en les émulant sous forme de verrous de plage d'octets sur l'ensemble du fichier. Cela signifie que les verrous fcntl (2) et flock () interagissent entre eux via NFS. Depuis Linux 2.6.37, le noyau prend en charge un mode de compatibilité qui permet aux verrous flock () (et également aux verrous de région d'octets fcntl (2)) d'être traités comme locaux; voir la discussion de l'option local_lock dans nfs (5).

Cela provient du site Web officiel des pages de manuel, http://man7.org/linux/man-pages/man2/flock.2.html qui montre la nouvelle version des pages de manuel 4.00

Linux 2.6.12 est sorti en 2005.

À l'origine, cela devait être un commentaire sur la réponse de janneb, mais je n'avais pas la réputation à l'époque. La mise à jour du document s'est produite en 2014: http://git.kernel.org/cgit/docs/man-pages/man-pages.git/commit/man2/flock.2?id=e449654fdb3f19aafc569df47d12bffdf6276236

Josip Rodin
la source
11

Je ne sais pas comment la flock()fonction PHP est implémentée, mais en supposant que c'est une interface avec le flock()syscall, cela ne fonctionne pas du tout sur NFS. Depuis la flock()page de manuel:

flock (2) ne verrouille pas les fichiers sur NFS. Utilisez plutôt fcntl (2): cela fonctionne sur NFS, étant donné une version suffisamment récente de Linux et un serveur qui prend en charge le verrouillage.

Et, bien sûr, tout ce qu'une page de manuel dit, aussi obsolète soit-elle, est la vérité ultime.

janneb
la source
+1, sarcasme! L'élément D10 de la FAQ NFS est détaillé.
themel
8

flock()fonctionne très bien sur Linux NFS, y compris à partir de PHP. Nous l'utilisons intensivement et l'avons testé à fond pour vérifier qu'il fonctionne comme vous le souhaitez. Vérifiez si vous exécutez tous les services nécessaires sur le client et le serveur. Recherchez "portmapper" et "rpc.statd". S'ils ne sont pas en cours d'exécution, vous devez déterminer quel script d'initialisation les démarre sur votre distribution. Sur les distributions basées sur Debian, c'est " /etc/init.d/portmap" et " /etc/init.d/nfs-common".

Depuis le client, exécutez " rpcinfo -u $NFSSERVER status" et voyez si vous obtenez une réponse. Sur ma configuration, j'obtiens "programme 100024 version 1 prêt et en attente" comme résultat.

Oh, gardez également à l'esprit que dans certaines circonstances, NFS et statd peuvent être perturbés si le client et le serveur n'ont pas d'entrées de nom d'hôte fiables l'un pour l'autre. Revérifiez /etc/hostsles deux machines.

Insyte
la source
1
Je ne suis pas vraiment en mesure de modifier les détails spécifiques au serveur. La fonction flock () est même désactivée du php.ini, car cela ne fonctionnerait pas, du moins c'est ce qu'on m'a dit.
rFactor
3

Je voulais juste répondre à moi-même. La solution peut être trouvée ici: http://us3.php.net/manual/en/function.flock.php#82521

rFactor
la source
3
La deuxième option répertoriée est exactement ce que je décris: utiliser le serveur de verrouillage intégré dans Linux NFS. Les étapes de dépannage ont été conçues pour déterminer pourquoi cela (apparemment) ne fonctionnait pas ...
Insyte