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?
fuente
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?
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
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.
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/hosts
en ambas máquinas.fuente
Solo quería responderme a mí mismo. La solución se puede encontrar aquí: http://us3.php.net/manual/en/function.flock.php#82521
fuente