Archivo de bloqueos en un NFS?

18

Mi servidor usa NFS (Sistema de archivos de red), y no puedo usar la función flock () de PHP. ¿Hay alguna manera de bloquear archivos en un NFS o es necesario hacerlo?

rFactor
fuente

Respuestas:

11

La página del manual flock(2)había estado desactualizada durante mucho tiempo, pero desde entonces se ha actualizado para decir (énfasis mío):

Desde Linux 2.6.12, los clientes NFS admiten bloqueos flock () al emularlos como bloqueos de rango de bytes en todo el archivo. Esto significa que los bloqueos fcntl (2) y flock () interactúan entre sí a través de NFS. Desde Linux 2.6.37, el núcleo admite un modo de compatibilidad que permite que los bloqueos flock () (y también los bloqueos de región de byte fcntl (2)) sean tratados como locales; vea la discusión de la opción local_lock en nfs (5).

Eso es del sitio web oficial de páginas de manual, http://man7.org/linux/man-pages/man2/flock.2.html que muestra la nueva versión de las páginas de manual 4.00

Linux 2.6.12 fue lanzado en 2005.

Originalmente estaba destinado a ser un comentario sobre la respuesta de janneb, pero no tenía la reputación en ese momento. La actualización del documento ocurrió en 2014: http://git.kernel.org/cgit/docs/man-pages/man-pages.git/commit/man2/flock.2?id=e449654fdb3f19aafc569df47d12bffdf6276236

Josip Rodin
fuente
11

No sé cómo flock()se implementa la función PHP , pero suponiendo que sea una interfaz para la flock()llamada al sistema, entonces no funciona en absoluto a través de NFS. Desde la página del flock()manual:

flock (2) no bloquea archivos a través de NFS. Utilice fcntl (2) en su lugar: eso funciona sobre NFS, dada una versión suficientemente reciente de Linux y un servidor que admite el bloqueo.

Y, por supuesto, todo lo que dice una página de manual, no importa cuán anticuado, es la verdad última.

janneb
fuente
+1, sarcasmo! El artículo D10 en las preguntas frecuentes de NFS elabora.
themel
8

flock()funciona bien en Linux NFS, incluso desde PHP. Lo usamos ampliamente y lo hemos probado exhaustivamente para verificar que funciona como se desea. Verifique si está ejecutando todos los servicios necesarios tanto en el cliente como en el servidor. Busque "portmapper" y "rpc.statd". Si no se están ejecutando, debe averiguar qué script de inicio los inicia en su distribución. En distribuciones basadas en Debian es " /etc/init.d/portmap" y " /etc/init.d/nfs-common".

Desde el cliente, ejecute " rpcinfo -u $NFSSERVER status" y vea si obtiene una respuesta. En mi configuración, obtengo el "programa 100024 versión 1 listo y esperando" como resultado.

Ah, también tenga en cuenta que, en algunas circunstancias, NFS y statd pueden enojarse si tanto el cliente como el servidor no tienen entradas confiables de nombre de host entre sí. Verifique dos veces /etc/hostsen ambas máquinas.

Insyte
fuente
1
Realmente no estoy en condiciones de alterar los detalles específicos del servidor. La función flock () incluso está deshabilitada desde php.ini, porque no funcionaría, al menos eso es lo que me han dicho.
rFactor
3

Solo quería responderme a mí mismo. La solución se puede encontrar aquí: http://us3.php.net/manual/en/function.flock.php#82521

rFactor
fuente
3
La segunda opción enumerada es exactamente lo que describo: usar el servidor de bloqueo incorporado en Linux NFS. Los pasos de solución de problemas se diseñaron para determinar por qué (aparentemente) no funcionaba ...
Insyte