Question Le fichier se verrouille sur un NFS?


Mon serveur utilise NFS (Network File System) et je ne parviens 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?


15
2017-09-19 06:21


origine




Réponses:


Je ne sais pas comment la fonction PHP flock () est implémentée, mais en supposant que ce soit une interface avec l'appel système de flock (), cela ne fonctionne pas du tout sur NFS. De la page de manuel flock ():

   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.

Et bien sûr, tout ce qu’une page de manuel dit, quelle que soit sa date de péremption, est la vérité ultime.


9
2017-10-13 08:16



+1, le sarcasme! Point D10 dans le FAQ NFS élabore. - themel


C'était censé être un commentaire sur la réponse de janneb ci-dessus, mais je n'avais pas la réputation à l'époque:

La page de manuel était obsolète depuis longtemps, mais a depuis été mise à jour pour indiquer (souligné par moi):

Dans les noyaux Linux jusqu’à 2.6.11, flock () ne verrouille pas les fichiers sur NFS   (c’est-à-dire que la portée des verrous était limitée au système local). Au lieu,   on pourrait utiliser le verrouillage de la plage d'octets de fcntl (2), qui fonctionne avec NFS,   donné une version suffisamment récente de Linux et un serveur qui   prend en charge le verrouillage. Depuis Linux 2.6.12, Les clients NFS supportent flock ()   verrouille en les émulant comme des verrous à octets sur tout le fichier. Ce   signifie que les verrous fcntl (2) et flock () interagissent   sur NFS. Depuis Linux 2.6.37, le noyau supporte une compatibilité   mode qui autorise les verrous flock () (et aussi les verrous de région d'octets fcntl (2))   être traité comme local; voir la discussion de l'option local_lock   dans NFS (5).

Le site Web officiel des pages de manuel mène à http://man7.org/linux/man-pages/man2/flock.2.html qui montre la nouvelle version des pages de manuel 4.00

La mise à jour du document a eu lieu en 2014: http://git.kernel.org/cgit/docs/man-pages/man-pages.git/commit/man2/flock.2?id=e449654fdb3f19aafc569df47d12bffdf6276236

Linux 2.6.12 est sorti le 18 juin 2005 - il y a presque une décennie maintenant.


9
2018-05-19 11:43





flock() fonctionne parfaitement sur Linux NFS, y compris à partir de PHP. Nous l’utilisons abondamment et l’avons soigneusement testé pour vérifier son bon fonctionnement. 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 fonctionnent pas, vous devez savoir quel script d'initialisation les lance 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, lancez "rpcinfo -u $NFSSERVER status"et voir si vous obtenez une réponse. Sur mon installation, je reçois" programme 100024 version 1 prêt et en attente "comme résultat.

N'oubliez pas non plus que, dans certaines circonstances, NFS et statd peuvent être contrariés si le client et le serveur ne possèdent pas d'entrées de nom d'hôte fiables l'un pour l'autre. Revérifier /etc/hosts sur les deux machines.


7
2017-09-19 06:32



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


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


2
2017-09-19 14:27



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